From f58e687dd6e0c171c22d6b46db654d7eda158293 Mon Sep 17 00:00:00 2001 From: sotmorskiy Date: Wed, 11 Nov 2020 04:04:25 +0000 Subject: [PATCH] NFTPAR-142 Off-chain and on-chain data schema. --- --- a/node/src/chain_spec.rs +++ b/node/src/chain_spec.rs @@ -159,17 +159,18 @@ 1, CollectionType { owner: get_account_id_from_seed::("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::("Alice"), unconfirmed_sponsor: get_account_id_from_seed::("Alice"), + const_on_chain_schema: vec![], + variable_on_chain_schema: vec![] }, )], nft_item_id: vec![], --- 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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?; Nft::::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?; @@ -126,7 +139,7 @@ let col_name1: Vec = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?; Nft::::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?; @@ -138,26 +151,32 @@ let col_name1: Vec = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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 = 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::::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::::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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?; - Nft::::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1, 2, 3].to_vec(), caller.clone())?; + let data = default_nft_data(); + Nft::::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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?; - Nft::::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1, 2, 3].to_vec(), caller.clone())?; + let data = default_nft_data(); + Nft::::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::::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?; - Nft::::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [].to_vec(), caller.clone())?; + let data = default_fungible_data(); + Nft::::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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?; - Nft::::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?; + let data = default_re_fungible_data(); + Nft::::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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?; - Nft::::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?; + let data = default_re_fungible_data(); + Nft::::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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?; - Nft::::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?; + let data = default_nft_data(); + Nft::::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?; Nft::::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::::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?; - Nft::::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [].to_vec(), caller.clone())?; + let data = default_fungible_data(); + Nft::::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?; Nft::::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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?; - Nft::::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?; + let data = default_re_fungible_data(); + Nft::::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?; Nft::::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 = "Test1".encode_utf16().collect::>(); let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); let token_prefix1: Vec = 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::::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 = "Test1".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1".to_vec(); + let mode: CollectionMode = CollectionMode::ReFungible(3); + let caller: T::AccountId = T::AccountId::from(whitelisted_caller()); + Nft::::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 = "Test1".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1".to_vec(); + let mode: CollectionMode = CollectionMode::ReFungible(3); + let caller: T::AccountId = T::AccountId::from(whitelisted_caller()); + Nft::::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 = "Test1".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1".to_vec(); + let mode: CollectionMode = CollectionMode::NFT; + let caller: T::AccountId = T::AccountId::from(whitelisted_caller()); + Nft::::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?; + let data = default_nft_data(); + Nft::::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 --- 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)) + } } --- 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 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, // 64 include null escape char pub description: Vec, // 256 include null escape char pub token_prefix: Vec, // 16 include null escape char - pub custom_data_size: u32, pub mint_mode: bool, pub offchain_schema: Vec, 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, // + pub const_on_chain_schema: Vec, // } #[derive(Encode, Decode, Default, Debug, Clone, PartialEq)] @@ -126,7 +126,8 @@ pub struct NftItemType { pub collection: u64, pub owner: AccountId, - pub data: Vec, + pub const_data: Vec, + pub variable_data: Vec, } #[derive(Encode, Decode, Default, Debug, Clone, PartialEq)] @@ -142,7 +143,8 @@ pub struct ReFungibleItemType { pub collection: u64, pub owner: Vec>, - pub data: Vec, + pub const_data: Vec, + pub variable_data: Vec, } #[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, + pub variable_data: Vec, } +#[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, + pub variable_data: Vec, +} + +#[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> + Into<::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, 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 = >::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 + ) -> DispatchResult { + let sender = ensure_signed(origin)?; + + Self::collection_exists(collection_id)?; + + // Modify permissions check + let target_collection = >::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 + ) -> DispatchResult { + let sender = ensure_signed(origin)?; + Self::check_owner_or_admin_permissions(collection_id, sender.clone())?; + + let mut target_collection = >::get(collection_id); + target_collection.const_on_chain_schema = schema; + >::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 + ) -> DispatchResult { + let sender = ensure_signed(origin)?; + Self::check_owner_or_admin_permissions(collection_id, sender.clone())?; + + let mut target_collection = >::get(collection_id); + target_collection.variable_on_chain_schema = schema; + >::insert(collection_id, target_collection); + + Ok(()) + } + // Sudo permissions function #[weight = 0] pub fn set_chain_limits( @@ -1322,13 +1461,13 @@ let target_collection = >::get(collection_id); match target_collection.mode { - CollectionMode::NFT(_) => { + CollectionMode::NFT => { >::get(collection_id, item_id).owner == subject } CollectionMode::Fungible(_) => { >::get(collection_id, item_id).owner == subject } - CollectionMode::ReFungible(_, _) => { + CollectionMode::ReFungible(_) => { >::get(collection_id, item_id) .owner .iter() @@ -1563,7 +1702,50 @@ >::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!(>::contains_key(collection_id, item_id), "Item does not exists"), + CollectionMode::ReFungible(_) => ensure!(>::contains_key(collection_id, item_id), "Item does not exists"), + CollectionMode::Fungible(_) => ensure!(>::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 + ) -> DispatchResult { + let mut item = >::get(collection_id, item_id); + + item.variable_data = data; + + >::insert(collection_id, item_id, item); + + Ok(()) + } + + fn set_nft_variable_data( + collection_id: u64, + item_id: u64, + data: Vec + ) -> DispatchResult { + let mut item = >::get(collection_id, item_id); + + item.variable_data = data; + >::insert(collection_id, item_id, item); + + Ok(()) + } + fn init_collection(item: &CollectionType) { // check params assert!( @@ -1804,7 +1986,7 @@ // sponsor timeout let sponsor_transfer = match _collection_mode { - CollectionMode::NFT(_) => { + CollectionMode::NFT => { let basket = >::get(collection_id, _item_id); let block_number = >::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 = >::get(collection_id, _item_id); let block_number = >::block_number() as T::BlockNumber; let limit_time = basket + ChainLimit::get().nft_sponsor_transfer_timeout.into(); --- a/pallets/nft/src/tests.rs +++ b/pallets/nft/src/tests.rs @@ -1,21 +1,16 @@ // Tests to be written here use crate::mock::*; -use crate::{AccessMode, ApprovePermissions, CollectionMode, Ownership, ChainLimits}; +use crate::{AccessMode, ApprovePermissions, CollectionMode, Ownership, ChainLimits, CreateItemData, NftItemType, CreateNftData, CreateFungibleData, CreateReFungibleData}; use frame_support::{assert_noop, assert_ok}; use frame_system::{ RawOrigin }; -// Use cases tests region -// #region -#[test] -fn create_nft_item() { - new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); +fn default_collection_numbers_limit() -> u64 { + 10 +} - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, +fn default_limits() { + assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { + collection_numbers_limit: default_collection_numbers_limit(), account_token_ownership_limit: 10, collections_admins_limit: 5, custom_data_limit: 2048, @@ -23,67 +18,86 @@ fungible_sponsor_transfer_timeout: 15, refungible_sponsor_transfer_timeout: 15, })); +} + +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 { }) +} - let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( +fn default_re_fungible_data () -> CreateItemData { + CreateItemData::ReFungible(CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }) +} + +fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64) -> u64 { + let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); + let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); + let token_prefix1: Vec = b"token_prefix1\0".to_vec(); + + let collection_id = TemplateModule::nextCollectionID(); + let origin1 = Origin::signed(owner); + assert_ok!(TemplateModule::create_collection( origin1.clone(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode )); - assert_eq!(TemplateModule::collection(1).owner, 1); + assert_eq!(TemplateModule::collection(collection_id).owner, owner); + return collection_id; +} + +fn create_test_collection(mode: &CollectionMode) -> u64 { + return create_test_collection_for_owner(&mode, 1); +} - assert_ok!(TemplateModule::create_item( +fn create_test_item(collection_id: u64, data: &CreateItemData) { + let origin1 = Origin::signed(1); + assert_ok!(TemplateModule::create_item( origin1.clone(), + collection_id, 1, - [1, 2, 3].to_vec(), - 1 + data.clone() )); - assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec()); - }); + } +// Use cases tests region +// #region #[test] -fn create_refungible_item() { +fn create_nft_item() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::ReFungible(2000, 3); + default_limits(); + let collection_id = create_test_collection(&CollectionMode::NFT); - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + let data = default_nft_data(); + create_test_item(collection_id, &data); + assert_eq!(TemplateModule::nft_item_id(collection_id, 1).const_data, data.const_data); + assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, data.variable_data); + }); +} - let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_eq!(TemplateModule::collection(1).owner, 1); +#[test] +fn create_refungible_item() { + new_test_ext().execute_with(|| { + default_limits(); + let collection_id = create_test_collection(&CollectionMode::ReFungible(3)); - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 2, 3].to_vec(), - 1 - )); + let data = default_re_fungible_data(); + create_test_item(collection_id, &data); + assert_eq!( + TemplateModule::refungible_item_id(collection_id, 1).const_data, + data.const_data + ); assert_eq!( - TemplateModule::refungible_item_id(1, 1).data, - [1, 2, 3].to_vec() + TemplateModule::refungible_item_id(collection_id, 1).variable_data, + data.variable_data ); assert_eq!( - TemplateModule::refungible_item_id(1, 1).owner[0], + TemplateModule::refungible_item_id(collection_id, 1).owner[0], Ownership { owner: 1, fraction: 1000 @@ -95,38 +109,12 @@ #[test] fn create_fungible_item() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::Fungible(3); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + let collection_id = create_test_collection(&CollectionMode::Fungible(3)); - let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_eq!(TemplateModule::collection(1).owner, 1); + let data = default_fungible_data(); + create_test_item(collection_id, &data); - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [].to_vec(), - 1 - )); - assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1); + assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).owner, 1); assert_eq!(TemplateModule::balance_count(1, 1), 1000); assert_eq!(TemplateModule::address_tokens(1, 1), [1]); }); @@ -135,38 +123,16 @@ #[test] fn transfer_fungible_item() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::Fungible(3); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::Fungible(3)); let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_eq!(TemplateModule::collection(1).owner, 1); - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [].to_vec(), - 1 - )); + let data = default_fungible_data(); + create_test_item(collection_id, &data); + assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1); assert_eq!(TemplateModule::balance_count(1, 1), 1000); assert_eq!(TemplateModule::address_tokens(1, 1), [1]); @@ -203,44 +169,25 @@ #[test] fn transfer_refungible_item() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::ReFungible(2000, 3); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::ReFungible(3)); - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + let data = default_re_fungible_data(); + create_test_item(collection_id, &data); let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_eq!(TemplateModule::collection(1).owner, 1); - - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 2, 3].to_vec(), - 1 - )); assert_eq!( - TemplateModule::refungible_item_id(1, 1).data, - [1, 2, 3].to_vec() + TemplateModule::refungible_item_id(collection_id, 1).const_data, + data.const_data + ); + assert_eq!( + TemplateModule::refungible_item_id(collection_id, 1).variable_data, + data.variable_data ); assert_eq!( - TemplateModule::refungible_item_id(1, 1).owner[0], + TemplateModule::refungible_item_id(collection_id, 1).owner[0], Ownership { owner: 1, fraction: 1000 @@ -310,38 +257,12 @@ #[test] fn transfer_nft_item() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - - let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_eq!(TemplateModule::collection(1).owner, 1); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 2, 3].to_vec(), - 1 - )); - assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec()); + let data = default_nft_data(); + create_test_item(collection_id, &data); assert_eq!(TemplateModule::balance_count(1, 1), 1); assert_eq!(TemplateModule::address_tokens(1, 1), [1]); @@ -358,39 +279,16 @@ #[test] fn nft_approve_and_transfer_from() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + let data = default_nft_data(); + create_test_item(collection_id, &data); let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_eq!(TemplateModule::collection(1).owner, 1); - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 2, 3].to_vec(), - 1 - )); - assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec()); assert_eq!(TemplateModule::balance_count(1, 1), 1); assert_eq!(TemplateModule::address_tokens(1, 1), [1]); @@ -436,49 +334,16 @@ #[test] fn refungible_approve_and_transfer_from() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::ReFungible(2000, 3); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::ReFungible(3)); + let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_eq!(TemplateModule::collection(1).owner, 1); - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 2, 3].to_vec(), - 1 - )); - assert_eq!( - TemplateModule::refungible_item_id(1, 1).data, - [1, 2, 3].to_vec() - ); - assert_eq!( - TemplateModule::refungible_item_id(1, 1).owner[0], - Ownership { - owner: 1, - fraction: 1000 - } - ); + let data = default_re_fungible_data(); + create_test_item(collection_id, &data); + assert_eq!(TemplateModule::balance_count(1, 1), 1000); assert_eq!(TemplateModule::address_tokens(1, 1), [1]); @@ -536,39 +401,16 @@ #[test] fn fungible_approve_and_transfer_from() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::Fungible(3); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::Fungible(3)); + + let data = default_fungible_data(); + create_test_item(collection_id, &data); let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_eq!(TemplateModule::collection(1).owner, 1); - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [].to_vec(), - 1 - )); - assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1); assert_eq!(TemplateModule::balance_count(1, 1), 1000); assert_eq!(TemplateModule::address_tokens(1, 1), [1]); @@ -642,104 +484,45 @@ #[test] fn change_collection_owner() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); + let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); assert_ok!(TemplateModule::change_collection_owner( origin1.clone(), - 1, + collection_id, 2 )); - assert_eq!(TemplateModule::collection(1).owner, 2); + assert_eq!(TemplateModule::collection(collection_id).owner, 2); }); } #[test] fn destroy_collection() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); + let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1)); + assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id)); }); } #[test] fn burn_nft_item() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2)); - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 2, 3].to_vec(), - 1 - )); + assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2)); + + let data = default_nft_data(); + create_test_item(collection_id, &data); - assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec()); - // check balance (collection with id = 1, user id = 1) assert_eq!(TemplateModule::balance_count(1, 1), 1); @@ -757,36 +540,15 @@ #[test] fn burn_fungible_item() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::Fungible(3); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::Fungible(3)); + let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2)); - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [].to_vec(), - 1 - )); + assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2)); + + let data = default_fungible_data(); + create_test_item(collection_id, &data); // check balance (collection with id = 1, user id = 1) assert_eq!(TemplateModule::balance_count(1, 1), 1000); @@ -805,55 +567,28 @@ #[test] fn burn_refungible_item() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::ReFungible(200, 3); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::ReFungible(3)); let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); assert_ok!(TemplateModule::set_mint_permission( origin1.clone(), - 1, + collection_id, true )); assert_ok!(TemplateModule::set_public_access_mode( origin1.clone(), - 1, + collection_id, AccessMode::WhiteList )); assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1)); assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2)); - assert_ok!(TemplateModule::create_item( - origin2.clone(), - 1, - [1, 2, 3].to_vec(), - 1 - )); - - assert_eq!( - TemplateModule::refungible_item_id(1, 1).data, - [1, 2, 3].to_vec() - ); + + let data = default_re_fungible_data(); + create_test_item(collection_id, &data); // check balance (collection with id = 1, user id = 2) assert_eq!(TemplateModule::balance_count(1, 1), 1000); @@ -872,110 +607,38 @@ #[test] fn add_collection_admin() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - + default_limits(); + + let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1); + create_test_collection_for_owner(&CollectionMode::NFT, 2); + create_test_collection_for_owner(&CollectionMode::NFT, 3); + let origin1 = Origin::signed(1); - let origin2 = Origin::signed(2); - let origin3 = Origin::signed(3); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode.clone() - )); - assert_ok!(TemplateModule::create_collection( - origin2.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode.clone() - )); - assert_ok!(TemplateModule::create_collection( - origin3.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode.clone() - )); - - assert_eq!(TemplateModule::collection(1).owner, 1); - assert_eq!(TemplateModule::collection(2).owner, 2); - assert_eq!(TemplateModule::collection(3).owner, 3); // collection admin - assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2)); - assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3)); + assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2)); + assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3)); - assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true); - assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true); + assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&2), true); + assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&3), true); }); } #[test] fn remove_collection_admin() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); + default_limits(); + + let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1); + create_test_collection_for_owner(&CollectionMode::NFT, 2); + create_test_collection_for_owner(&CollectionMode::NFT, 3); let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - let origin3 = Origin::signed(3); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode.clone() - )); - assert_ok!(TemplateModule::create_collection( - origin2.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode.clone() - )); - assert_ok!(TemplateModule::create_collection( - origin3.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode.clone() - )); - - assert_eq!(TemplateModule::collection(1).owner, 1); - assert_eq!(TemplateModule::collection(2).owner, 2); - assert_eq!(TemplateModule::collection(3).owner, 3); // collection admin - assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2)); - assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3)); + assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2)); + assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3)); assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true); assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true); @@ -993,125 +656,50 @@ #[test] fn balance_of() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let nft_mode: CollectionMode = CollectionMode::NFT(2000); - let furg_mode: CollectionMode = CollectionMode::Fungible(3); - let refung_mode: CollectionMode = CollectionMode::ReFungible(2000, 3); - + default_limits(); + + let nft_collection_id = create_test_collection(&CollectionMode::NFT); + let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3)); + let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3)); + let origin1 = Origin::signed(1); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - nft_mode.clone() - )); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - furg_mode.clone() - )); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - refung_mode.clone() - )); - - assert_eq!(TemplateModule::collection(1).owner, 1); - assert_eq!(TemplateModule::collection(2).owner, 1); - assert_eq!(TemplateModule::collection(3).owner, 1); // check balance before - assert_eq!(TemplateModule::balance_count(1, 1), 0); - assert_eq!(TemplateModule::balance_count(2, 1), 0); - assert_eq!(TemplateModule::balance_count(3, 1), 0); + assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0); + assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0); + assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 0); - // create item - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 1, 1].to_vec(), - 1 - )); - - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 2, - [].to_vec(), - 1 - )); - - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 3, - [1, 1, 1].to_vec(), - 1 - )); + let nft_data = default_nft_data(); + create_test_item(nft_collection_id, &nft_data); + + let fungible_data = default_fungible_data(); + create_test_item(fungible_collection_id, &fungible_data); + + let re_fungible_data = default_re_fungible_data(); + create_test_item(re_fungible_collection_id, &re_fungible_data); // check balance (collection with id = 1, user id = 1) - assert_eq!(TemplateModule::balance_count(1, 1), 1); - assert_eq!(TemplateModule::balance_count(2, 1), 1000); - assert_eq!(TemplateModule::balance_count(3, 1), 1000); - assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 1); - assert_eq!(TemplateModule::fungible_item_id(2, 1).owner, 1); - assert_eq!(TemplateModule::refungible_item_id(3, 1).owner[0].owner, 1); + assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1); + assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 1000); + assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1000); + assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1); + assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).owner, 1); + assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1); }); } #[test] fn approve() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let nft_mode: CollectionMode = CollectionMode::NFT(2000); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); + + let data = default_nft_data(); + create_test_item(collection_id, &data); + let origin1 = Origin::signed(1); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - nft_mode.clone() - )); - - assert_eq!(TemplateModule::collection(1).owner, 1); - - // create item - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 1, 1].to_vec(), - 1 - )); - + // approve assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1)); assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2); @@ -1121,40 +709,14 @@ #[test] fn transfer_from() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - - assert_eq!(TemplateModule::collection(1).owner, 1); - - // create item - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 1, 1].to_vec(), - 1 - )); + let data = default_nft_data(); + create_test_item(collection_id, &data); // approve assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1)); @@ -1197,99 +759,41 @@ #[test] fn owner_can_add_address_to_white_list() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); + let origin1 = Origin::signed(1); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - - assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); - assert_eq!(TemplateModule::white_list(1)[0], 2); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2)); + assert_eq!(TemplateModule::white_list(collection_id)[0], 2); }); } #[test] fn admin_can_add_address_to_white_list() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - - assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2)); - assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), 1, 3)); - assert_eq!(TemplateModule::white_list(1)[0], 3); + assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2)); + assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3)); + assert_eq!(TemplateModule::white_list(collection_id)[0], 3); }); } #[test] fn nonprivileged_user_cannot_add_address_to_white_list() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - let origin1 = Origin::signed(1); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); + let origin2 = Origin::signed(2); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_noop!( - TemplateModule::add_to_white_list(origin2.clone(), 1, 3), + TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3), "You do not have permissions to modify this collection" ); }); @@ -1298,17 +802,9 @@ #[test] fn nobody_can_add_address_to_white_list_of_nonexisting_collection() { new_test_ext().execute_with(|| { + default_limits(); + let origin1 = Origin::signed(1); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); assert_noop!( TemplateModule::add_to_white_list(origin1.clone(), 1, 2), @@ -1320,33 +816,13 @@ #[test] fn nobody_can_add_address_to_white_list_of_deleted_collection() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - let origin1 = Origin::signed(1); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - - assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1)); + assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id)); assert_noop!( - TemplateModule::add_to_white_list(origin1.clone(), 1, 2), + TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2), "This collection does not exist" ); }); @@ -1356,165 +832,80 @@ #[test] fn address_is_already_added_to_white_list() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - - assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); - assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); - assert_eq!(TemplateModule::white_list(1)[0], 2); - assert_eq!(TemplateModule::white_list(1).len(), 1); + + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2)); + assert_eq!(TemplateModule::white_list(collection_id)[0], 2); + assert_eq!(TemplateModule::white_list(collection_id).len(), 1); }); } #[test] fn owner_can_remove_address_from_white_list() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - let origin1 = Origin::signed(1); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); - assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + let origin1 = Origin::signed(1); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2)); assert_ok!(TemplateModule::remove_from_white_list( origin1.clone(), - 1, + collection_id, 2 )); - assert_eq!(TemplateModule::white_list(1).len(), 0); + assert_eq!(TemplateModule::white_list(collection_id).len(), 0); }); } #[test] fn admin_can_remove_address_from_white_list() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2)); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - - assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2)); - - assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 3)); assert_ok!(TemplateModule::remove_from_white_list( origin2.clone(), - 1, + collection_id, 3 )); - assert_eq!(TemplateModule::white_list(1).len(), 0); + assert_eq!(TemplateModule::white_list(collection_id).len(), 0); }); } #[test] fn nonprivileged_user_cannot_remove_address_from_white_list() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - - assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2)); assert_noop!( - TemplateModule::remove_from_white_list(origin2.clone(), 1, 2), + TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2), "You do not have permissions to modify this collection" ); - assert_eq!(TemplateModule::white_list(1)[0], 2); + assert_eq!(TemplateModule::white_list(collection_id)[0], 2); }); } #[test] fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() { new_test_ext().execute_with(|| { + default_limits(); let origin1 = Origin::signed(1); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); assert_noop!( TemplateModule::remove_from_white_list(origin1.clone(), 1, 2), @@ -1526,38 +917,19 @@ #[test] fn nobody_can_remove_address_from_white_list_of_deleted_collection() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - - assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); - assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2)); + assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id)); assert_noop!( - TemplateModule::remove_from_white_list(origin2.clone(), 1, 2), + TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2), "This collection does not exist" ); - assert_eq!(TemplateModule::white_list(1).len(), 0); + assert_eq!(TemplateModule::white_list(collection_id).len(), 0); }); } @@ -1565,42 +937,23 @@ #[test] fn address_is_already_removed_from_white_list() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - - assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2)); assert_ok!(TemplateModule::remove_from_white_list( origin1.clone(), - 1, + collection_id, 2 )); assert_ok!(TemplateModule::remove_from_white_list( origin1.clone(), - 1, + collection_id, 2 )); - assert_eq!(TemplateModule::white_list(1).len(), 0); + assert_eq!(TemplateModule::white_list(collection_id).len(), 0); }); } @@ -1608,44 +961,21 @@ #[test] fn white_list_test_1() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_eq!(TemplateModule::collection(1).owner, 1); - - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 2, 3].to_vec(), - 1 - )); + + let data = default_nft_data(); + create_test_item(collection_id, &data); assert_ok!(TemplateModule::set_public_access_mode( origin1.clone(), - 1, + collection_id, AccessMode::WhiteList )); - assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2)); assert_noop!( TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1), @@ -1657,41 +987,17 @@ #[test] fn white_list_test_2() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_eq!(TemplateModule::collection(1).owner, 1); - - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 2, 3].to_vec(), - 1 - )); + + let data = default_nft_data(); + create_test_item(collection_id, &data); assert_ok!(TemplateModule::set_public_access_mode( origin1.clone(), - 1, + collection_id, AccessMode::WhiteList )); assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1)); @@ -1718,41 +1024,18 @@ #[test] fn white_list_test_3() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_eq!(TemplateModule::collection(1).owner, 1); - - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 2, 3].to_vec(), - 1 - )); + + let data = default_nft_data(); + create_test_item(collection_id, &data); assert_ok!(TemplateModule::set_public_access_mode( origin1.clone(), - 1, + collection_id, AccessMode::WhiteList )); assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1)); @@ -1767,45 +1050,22 @@ #[test] fn white_list_test_4() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_eq!(TemplateModule::collection(1).owner, 1); - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 2, 3].to_vec(), - 1 - )); + let data = default_nft_data(); + create_test_item(collection_id, &data); assert_ok!(TemplateModule::set_public_access_mode( origin1.clone(), - 1, + collection_id, AccessMode::WhiteList )); - assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1)); - assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2)); // do approve assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1)); @@ -1813,7 +1073,7 @@ assert_ok!(TemplateModule::remove_from_white_list( origin1.clone(), - 1, + collection_id, 2 )); @@ -1828,41 +1088,18 @@ #[test] fn white_list_test_5() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_eq!(TemplateModule::collection(1).owner, 1); - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 2, 3].to_vec(), - 1 - )); + let data = default_nft_data(); + create_test_item(collection_id, &data); assert_ok!(TemplateModule::set_public_access_mode( origin1.clone(), - 1, + collection_id, AccessMode::WhiteList )); assert_noop!( @@ -1876,32 +1113,14 @@ #[test] fn white_list_test_6() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); assert_ok!(TemplateModule::set_public_access_mode( origin1.clone(), - 1, + collection_id, AccessMode::WhiteList )); @@ -1918,45 +1137,22 @@ #[test] fn white_list_test_7() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - + let data = default_nft_data(); + create_test_item(collection_id, &data); + let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_eq!(TemplateModule::collection(1).owner, 1); - - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 2, 3].to_vec(), - 1 - )); assert_ok!(TemplateModule::set_public_access_mode( origin1.clone(), - 1, + collection_id, AccessMode::WhiteList )); - assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1)); - assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2)); assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1)); }); @@ -1965,45 +1161,22 @@ #[test] fn white_list_test_8() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - + let data = default_nft_data(); + create_test_item(collection_id, &data); + let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_eq!(TemplateModule::collection(1).owner, 1); - - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 2, 3].to_vec(), - 1 - )); assert_ok!(TemplateModule::set_public_access_mode( origin1.clone(), - 1, + collection_id, AccessMode::WhiteList )); - assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1)); - assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2)); // do approve assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1)); @@ -2024,47 +1197,24 @@ #[test] fn white_list_test_9() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); assert_ok!(TemplateModule::set_public_access_mode( origin1.clone(), - 1, + collection_id, AccessMode::WhiteList )); assert_ok!(TemplateModule::set_mint_permission( origin1.clone(), - 1, + collection_id, false )); - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 2, 3].to_vec(), - 1 - )); + let data = default_nft_data(); + create_test_item(collection_id, &data); }); } @@ -2072,49 +1222,31 @@ #[test] fn white_list_test_10() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); assert_ok!(TemplateModule::set_public_access_mode( origin1.clone(), - 1, + collection_id, AccessMode::WhiteList )); assert_ok!(TemplateModule::set_mint_permission( origin1.clone(), - 1, + collection_id, false )); - assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2)); + assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2)); assert_ok!(TemplateModule::create_item( origin2.clone(), - 1, - [1, 2, 3].to_vec(), - 2 + collection_id, + 2, + default_nft_data() )); }); } @@ -2123,45 +1255,27 @@ #[test] fn white_list_test_11() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); assert_ok!(TemplateModule::set_public_access_mode( origin1.clone(), - 1, + collection_id, AccessMode::WhiteList )); assert_ok!(TemplateModule::set_mint_permission( origin1.clone(), - 1, + collection_id, false )); - assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2)); assert_noop!( - TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2), + TemplateModule::create_item(origin2.clone(), 1, vec![1, 2, 3], 2), "Public minting is not allowed for this collection" ); }); @@ -2171,44 +1285,26 @@ #[test] fn white_list_test_12() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); assert_ok!(TemplateModule::set_public_access_mode( origin1.clone(), - 1, + collection_id, AccessMode::WhiteList )); assert_ok!(TemplateModule::set_mint_permission( origin1.clone(), - 1, + collection_id, false )); assert_noop!( - TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2), + TemplateModule::create_item(origin2.clone(), 1, vec![1, 2, 3], 2), "Public minting is not allowed for this collection" ); }); @@ -2218,47 +1314,25 @@ #[test] fn white_list_test_13() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); assert_ok!(TemplateModule::set_public_access_mode( origin1.clone(), - 1, + collection_id, AccessMode::WhiteList )); assert_ok!(TemplateModule::set_mint_permission( origin1.clone(), - 1, + collection_id, true )); - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 2, 3].to_vec(), - 1 - )); + let data = default_nft_data(); + create_test_item(collection_id, &data); }); } @@ -2266,49 +1340,31 @@ #[test] fn white_list_test_14() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); assert_ok!(TemplateModule::set_public_access_mode( origin1.clone(), - 1, + collection_id, AccessMode::WhiteList )); assert_ok!(TemplateModule::set_mint_permission( origin1.clone(), - 1, + collection_id, true )); - assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2)); + assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2)); assert_ok!(TemplateModule::create_item( origin2.clone(), 1, - [1, 2, 3].to_vec(), - 2 + 2, + default_nft_data() )); }); } @@ -2317,44 +1373,26 @@ #[test] fn white_list_test_15() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); assert_ok!(TemplateModule::set_public_access_mode( origin1.clone(), - 1, + collection_id, AccessMode::WhiteList )); assert_ok!(TemplateModule::set_mint_permission( origin1.clone(), - 1, + collection_id, true )); assert_noop!( - TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2), + TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data()), "Address is not in white list" ); }); @@ -2364,48 +1402,30 @@ #[test] fn white_list_test_16() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); let origin2 = Origin::signed(2); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); assert_ok!(TemplateModule::set_public_access_mode( origin1.clone(), - 1, + collection_id, AccessMode::WhiteList )); assert_ok!(TemplateModule::set_mint_permission( origin1.clone(), - 1, + collection_id, true )); - assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2)); + assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2)); assert_ok!(TemplateModule::create_item( origin2.clone(), 1, - [1, 2, 3].to_vec(), - 2 + 2, + default_nft_data() )); }); } @@ -2414,29 +1434,9 @@ #[test] fn total_number_collections_bound() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - - let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); + default_limits(); + + create_test_collection(&CollectionMode::NFT); }); } @@ -2444,32 +1444,12 @@ #[test] fn total_number_collections_bound_neg() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); + default_limits(); let origin1 = Origin::signed(1); - for _ in 0..10 { - - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode.clone() - )); + for _ in 0..default_collection_numbers_limit() { + create_test_collection(&CollectionMode::NFT) } // 11-th collection in chain. Expects error @@ -2487,43 +1467,13 @@ #[test] fn owned_tokens_bound() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { - collection_numbers_limit: 10, - account_token_ownership_limit: 10, - collections_admins_limit: 5, - custom_data_limit: 2048, - nft_sponsor_transfer_timeout: 15, - fungible_sponsor_transfer_timeout: 15, - refungible_sponsor_transfer_timeout: 15, - })); - - let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 2, 3].to_vec(), - 1 - )); - - assert_ok!(TemplateModule::create_item( - origin1.clone(), - 1, - [1, 2, 3].to_vec(), - 1 - )); + let data = default_nft_data(); + create_test_item(collection_id, &data); + create_test_item(collection_id, &data); }); } @@ -2531,11 +1481,6 @@ #[test] fn owned_tokens_bound_neg() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { collection_numbers_limit: 10, account_token_ownership_limit: 1, @@ -2545,28 +1490,18 @@ fungible_sponsor_transfer_timeout: 15, refungible_sponsor_transfer_timeout: 15, })); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); + let data = default_nft_data(); + create_test_item(collection_id, &data); - assert_ok!(TemplateModule::create_item( + assert_noop!(TemplateModule::create_item( origin1.clone(), 1, - [1, 2, 3].to_vec(), - 1 - )); - - assert_noop!(TemplateModule::create_item( - origin1.clone(), 1, - [1, 2, 3].to_vec(), - 1 + data ), "Owned tokens by a single address bound exceeded"); }); } @@ -2575,11 +1510,6 @@ #[test] fn collection_admins_bound() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { collection_numbers_limit: 10, account_token_ownership_limit: 10, @@ -2589,18 +1519,13 @@ fungible_sponsor_transfer_timeout: 15, refungible_sponsor_transfer_timeout: 15, })); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - - assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2)); - assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3)); + + assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2)); + assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3)); }); } @@ -2608,11 +1533,6 @@ #[test] fn collection_admins_bound_neg() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); - assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { collection_numbers_limit: 10, account_token_ownership_limit: 1, @@ -2622,78 +1542,167 @@ fungible_sponsor_transfer_timeout: 15, refungible_sponsor_transfer_timeout: 15, })); + + let collection_id = create_test_collection(&CollectionMode::NFT); let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( - origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); - assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2)); - assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3), "Number of collection admins bound exceeded"); + assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2)); + assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3), "Number of collection admins bound exceeded"); }); } -// Custom data size. Positive test +// NFT custom data size. Negative test const_data. #[test] -fn custom_data_size_bound() { +fn custom_data_size_nft_const_data_bound_neg() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); + assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { + collection_numbers_limit: 10, + account_token_ownership_limit: 10, + collections_admins_limit: 5, + custom_data_limit: 2, + nft_sponsor_transfer_timeout: 15, + fungible_sponsor_transfer_timeout: 15, + refungible_sponsor_transfer_timeout: 15, + })); + + let collection_id = create_test_collection(&CollectionMode::NFT); + + let origin1 = Origin::signed(1); + let too_big_const_data = CreateItemData::NFT(CreateNftData{ + const_data: vec![1, 2, 3, 4], + variable_data: vec![] + }); + + assert_noop!(TemplateModule::create_item( + origin1.clone(), + collection_id, + 1, + too_big_const_data + ), "const_data exceeded data limit: 2."); + }); +} +// NFT custom data size. Negative test variable_data. +#[test] +fn custom_data_size_nft_variable_data_bound_neg() { + new_test_ext().execute_with(|| { assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { collection_numbers_limit: 10, account_token_ownership_limit: 10, collections_admins_limit: 5, - custom_data_limit: 2048, + custom_data_limit: 2, nft_sponsor_transfer_timeout: 15, fungible_sponsor_transfer_timeout: 15, refungible_sponsor_transfer_timeout: 15, })); + let collection_id = create_test_collection(&CollectionMode::NFT); + let origin1 = Origin::signed(1); - assert_ok!(TemplateModule::create_collection( + let too_big_const_data = CreateItemData::NFT(CreateNftData{ + const_data: vec![], + variable_data: vec![1, 2, 3, 4] + }); + + assert_noop!(TemplateModule::create_item( origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - )); + collection_id, + 1, + too_big_const_data + ), "variable_data exceeded data limit: 2."); }); } -// Custom data size. Negotive test +// Re fungible custom data size. Negative test const_data. #[test] -fn custom_data_size_bound_neg() { +fn custom_data_size_re_fungible_const_data_bound_neg() { new_test_ext().execute_with(|| { - let col_name1: Vec = "Test1\0".encode_utf16().collect::>(); - let col_desc1: Vec = "TestDescription1\0".encode_utf16().collect::>(); - let token_prefix1: Vec = b"token_prefix1\0".to_vec(); - let mode: CollectionMode = CollectionMode::NFT(2000); + assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { + collection_numbers_limit: 10, + account_token_ownership_limit: 10, + collections_admins_limit: 5, + custom_data_limit: 2, + nft_sponsor_transfer_timeout: 15, + fungible_sponsor_transfer_timeout: 15, + refungible_sponsor_transfer_timeout: 15, + })); + + let collection_id = create_test_collection(&CollectionMode::NFT); + + let origin1 = Origin::signed(1); + let too_big_const_data = CreateItemData::NFT(CreateNftData{ + const_data: vec![1, 2, 3, 4], + variable_data: vec![] + }); + + assert_noop!(TemplateModule::create_item( + origin1.clone(), + collection_id, + 1, + too_big_const_data + ), "const_data exceeded data limit: 2."); + }); +} +// Re fungible custom data size. Negative test variable_data. +#[test] +fn custom_data_size_re_fungible_variable_data_bound_neg() { + new_test_ext().execute_with(|| { assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { collection_numbers_limit: 10, account_token_ownership_limit: 10, collections_admins_limit: 5, - custom_data_limit: 200, + custom_data_limit: 2, nft_sponsor_transfer_timeout: 15, fungible_sponsor_transfer_timeout: 15, refungible_sponsor_transfer_timeout: 15, })); + let collection_id = create_test_collection(&CollectionMode::NFT); + let origin1 = Origin::signed(1); - assert_noop!(TemplateModule::create_collection( + let too_big_const_data = CreateItemData::NFT(CreateNftData{ + const_data: vec![], + variable_data: vec![1, 2, 3, 4] + }); + + assert_noop!(TemplateModule::create_item( origin1.clone(), - col_name1.clone(), - col_desc1.clone(), - token_prefix1.clone(), - mode - ), "Custom data size bound exceeded"); + collection_id, + 1, + too_big_const_data + ), "variable_data exceeded data limit: 2."); }); } // #endregion + +#[test] +fn set_const_on_chain_schema() { + new_test_ext().execute_with(|| { + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); + + let origin1 = Origin::signed(1); + assert_ok!(TemplateModule::set_const_on_chain_schema(origin1, collection_id, "test const on chain schema".to_vec())); + + assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, "test const on chain schema".to_vec()); + assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, "".to_vec()); + }); +} + +#[test] +fn set_variable_on_chain_schema() { + new_test_ext().execute_with(|| { + default_limits(); + + let collection_id = create_test_collection(&CollectionMode::NFT); + + let origin1 = Origin::signed(1); + assert_ok!(TemplateModule::set_variable_on_chain_schema(origin1, collection_id, "test variable on chain schema".to_vec())); + + assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, "".to_vec()); + assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, "test variable on chain schema".to_vec()); + }); +} \ No newline at end of file --- 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)) + } } -- gitstuff