difftreelog
NFTPAR-142 Off-chain and on-chain data schema.
in: master
6 files changed
node/src/chain_spec.rsdiffbeforeafterboth159 1,159 1,160 CollectionType {160 CollectionType {161 owner: get_account_id_from_seed::<sr25519::Public>("Alice"),161 owner: get_account_id_from_seed::<sr25519::Public>("Alice"),162 mode: CollectionMode::NFT(50),162 mode: CollectionMode::NFT,163 access: AccessMode::Normal,163 access: AccessMode::Normal,164 decimal_points: 0,164 decimal_points: 0,165 name: vec![],165 name: vec![],166 description: vec![],166 description: vec![],167 token_prefix: vec![],167 token_prefix: vec![],168 custom_data_size: 50,169 mint_mode: false,168 mint_mode: false,170 offchain_schema: vec![],169 offchain_schema: vec![],171 sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),170 sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),172 unconfirmed_sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),171 unconfirmed_sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),172 const_on_chain_schema: vec![],173 variable_on_chain_schema: vec![]173 },174 },174 )],175 )],175 nft_item_id: vec![],176 nft_item_id: vec![],pallets/nft/src/benchmarking.rsdiffbeforeafterboth9910 const SEED: u32 = 1;10 const SEED: u32 = 1;1112 fn default_nft_data() -> CreateItemData {13 CreateItemData::NFT(CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] })14 }15 16 fn default_fungible_data () -> CreateItemData {17 CreateItemData::Fungible(CreateFungibleData { })18 }19 20 fn default_re_fungible_data () -> CreateItemData {21 CreateItemData::ReFungible(CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] })22 }23112412 benchmarks! {25 benchmarks! {17 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();30 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();18 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();31 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();19 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();32 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();20 let mode: CollectionMode = CollectionMode::NFT(2000);33 let mode: CollectionMode = CollectionMode::NFT;21 let caller: T::AccountId = account("caller", 0, SEED);34 let caller: T::AccountId = account("caller", 0, SEED);22 }: create_collection(RawOrigin::Signed(caller.clone()), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode)35 }: create_collection(RawOrigin::Signed(caller.clone()), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode)23 verify {36 verify {28 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();41 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();29 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();42 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();30 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();43 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();31 let mode: CollectionMode = CollectionMode::NFT(2000);44 let mode: CollectionMode = CollectionMode::NFT;32 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());45 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());33 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;46 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;34 }: destroy_collection(RawOrigin::Signed(caller.clone()), 2)47 }: destroy_collection(RawOrigin::Signed(caller.clone()), 2)37 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();50 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();38 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();51 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();39 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();52 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();40 let mode: CollectionMode = CollectionMode::NFT(2000);53 let mode: CollectionMode = CollectionMode::NFT;41 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());54 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());42 let whitelist_account: T::AccountId = account("admin", 0, SEED);55 let whitelist_account: T::AccountId = account("admin", 0, SEED);43 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;56 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;47 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();60 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();48 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();61 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();49 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();62 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();50 let mode: CollectionMode = CollectionMode::NFT(2000);63 let mode: CollectionMode = CollectionMode::NFT;51 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());64 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());52 let whitelist_account: T::AccountId = account("admin", 0, SEED);65 let whitelist_account: T::AccountId = account("admin", 0, SEED);53 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;66 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;58 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();71 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();59 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();72 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();60 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();73 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();61 let mode: CollectionMode = CollectionMode::NFT(2000);74 let mode: CollectionMode = CollectionMode::NFT;62 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());75 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());63 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;76 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;64 }: set_public_access_mode(RawOrigin::Signed(caller.clone()), 2, AccessMode::WhiteList)77 }: set_public_access_mode(RawOrigin::Signed(caller.clone()), 2, AccessMode::WhiteList)67 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();80 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();68 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();81 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();69 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();82 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();70 let mode: CollectionMode = CollectionMode::NFT(2000);83 let mode: CollectionMode = CollectionMode::NFT;71 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());84 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());72 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;85 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;73 }: set_mint_permission(RawOrigin::Signed(caller.clone()), 2, true)86 }: set_mint_permission(RawOrigin::Signed(caller.clone()), 2, true)76 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();89 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();77 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();90 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();78 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();91 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();79 let mode: CollectionMode = CollectionMode::NFT(2000);92 let mode: CollectionMode = CollectionMode::NFT;80 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());93 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());81 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;94 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;82 let new_owner: T::AccountId = account("admin", 0, SEED);95 let new_owner: T::AccountId = account("admin", 0, SEED);86 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();99 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();87 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();100 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();88 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();101 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();89 let mode: CollectionMode = CollectionMode::NFT(2000);102 let mode: CollectionMode = CollectionMode::NFT;90 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());103 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());91 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;104 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;92 let new_admin: T::AccountId = account("admin", 0, SEED);105 let new_admin: T::AccountId = account("admin", 0, SEED);96 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();109 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();97 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();110 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();98 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();111 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();99 let mode: CollectionMode = CollectionMode::NFT(2000);112 let mode: CollectionMode = CollectionMode::NFT;100 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());113 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());101 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;114 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;102 let new_admin: T::AccountId = account("admin", 0, SEED);115 let new_admin: T::AccountId = account("admin", 0, SEED);107 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();120 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();108 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();121 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();109 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();122 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();110 let mode: CollectionMode = CollectionMode::NFT(2000);123 let mode: CollectionMode = CollectionMode::NFT;111 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());124 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());112 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;125 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;113 }: set_collection_sponsor(RawOrigin::Signed(caller.clone()), 2, caller.clone())126 }: set_collection_sponsor(RawOrigin::Signed(caller.clone()), 2, caller.clone())116 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();129 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();117 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();130 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();118 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();131 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();119 let mode: CollectionMode = CollectionMode::NFT(2000);132 let mode: CollectionMode = CollectionMode::NFT;120 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());133 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());121 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;134 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;122 Nft::<T>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?;135 Nft::<T>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?;126 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();139 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();127 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();140 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();128 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();141 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();129 let mode: CollectionMode = CollectionMode::NFT(2000);142 let mode: CollectionMode = CollectionMode::NFT;130 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());143 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());131 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;144 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;132 Nft::<T>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?;145 Nft::<T>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?;138 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();151 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();139 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();152 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();140 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();153 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();141 let mode: CollectionMode = CollectionMode::NFT(2000);154 let mode: CollectionMode = CollectionMode::NFT;142 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());155 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());143 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;156 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;144157 let data = default_nft_data();158 145 }: create_item(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec(), caller.clone())159 }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)146160147 #[extra]161 #[extra]148 create_item_nft_large {162 create_item_nft_large {149 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();163 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();150 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();164 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();151 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();165 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();152 let mode: CollectionMode = CollectionMode::NFT(2000);166 let mode: CollectionMode = CollectionMode::NFT;153 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());167 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());154 let mut item_large: Vec<u8> = Vec::new(); 168 let nft_data = CreateNftData {169 const_data: vec![],170 variable_data: vec![]171 };155 for i in 0..1998 {172 for i in 0..1998 {156 item_large.push(10);173 nft_data.const_data.push(10);174 nft_data.variable_data.push(10);157 }175 }176 let mut data = CreateItemData::NFT(nft_data);158 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;177 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;159178160 }: create_item(RawOrigin::Signed(caller.clone()), 2, item_large, caller.clone())179 }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)161180162 // fungible item181 // fungible item163 create_item_fungible {182 create_item_fungible {167 let mode: CollectionMode = CollectionMode::Fungible(3);186 let mode: CollectionMode = CollectionMode::Fungible(3);168 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());187 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());169 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;188 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;189 let data = default_fungible_data();170190171 }: create_item(RawOrigin::Signed(caller.clone()), 2, [].to_vec(), caller.clone())191 }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)172192173 // refungible item193 // refungible item174 create_item_refungible {194 create_item_refungible {175 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();195 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();176 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();196 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();177 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();197 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();178 let mode: CollectionMode = CollectionMode::ReFungible(3, 3);198 let mode: CollectionMode = CollectionMode::ReFungible(3);179 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());199 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());180 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;200 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;201 let data = default_re_fungible_data();181202182 }: create_item(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec(), caller.clone())203 }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)183204184 burn_item {205 burn_item {185 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();206 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();186 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();207 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();187 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();208 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();188 let mode: CollectionMode = CollectionMode::NFT(2000);209 let mode: CollectionMode = CollectionMode::NFT;189 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());210 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());190 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;211 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;212 let data = default_nft_data();191 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1, 2, 3].to_vec(), caller.clone())?;213 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;192214193 }: burn_item(RawOrigin::Signed(caller.clone()), 2, 1)215 }: burn_item(RawOrigin::Signed(caller.clone()), 2, 1)194216195 transfer_nft {217 transfer_nft {196 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();218 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();197 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();219 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();198 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();220 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();199 let mode: CollectionMode = CollectionMode::NFT(2000);221 let mode: CollectionMode = CollectionMode::NFT;200 let recipient: T::AccountId = account("recipient", 0, SEED);222 let recipient: T::AccountId = account("recipient", 0, SEED);201 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());223 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());202 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;224 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;225 let data = default_nft_data();203 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1, 2, 3].to_vec(), caller.clone())?;226 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;204227205 }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)228 }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)206 229 212 let recipient: T::AccountId = account("recipient", 0, SEED);235 let recipient: T::AccountId = account("recipient", 0, SEED);213 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());236 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());214 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;237 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;238 let data = default_fungible_data();215 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [].to_vec(), caller.clone())?;239 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;216240217 }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)241 }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)218242219 transfer_refungible {243 transfer_refungible {220 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();244 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();221 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();245 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();222 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();246 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();223 let mode: CollectionMode = CollectionMode::ReFungible(3,3);247 let mode: CollectionMode = CollectionMode::ReFungible(3);224 let recipient: T::AccountId = account("recipient", 0, SEED);248 let recipient: T::AccountId = account("recipient", 0, SEED);225 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());249 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());226 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;250 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;251 let data = default_re_fungible_data();227 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?;252 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;228253229 }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)254 }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)230255231 approve {256 approve {232 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();257 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();233 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();258 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();234 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();259 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();235 let mode: CollectionMode = CollectionMode::ReFungible(3,3);260 let mode: CollectionMode = CollectionMode::ReFungible(3);236 let recipient: T::AccountId = account("recipient", 0, SEED);261 let recipient: T::AccountId = account("recipient", 0, SEED);237 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());262 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());238 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;263 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;264 let data = default_re_fungible_data();239 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?;265 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;240266241 }: approve(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1)267 }: approve(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1)242268245 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();271 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();246 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();272 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();247 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();273 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();248 let mode: CollectionMode = CollectionMode::NFT(300);274 let mode: CollectionMode = CollectionMode::NFT;249 let recipient: T::AccountId = account("recipient", 0, SEED);275 let recipient: T::AccountId = account("recipient", 0, SEED);250 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());276 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());251 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;277 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;278 let data = default_nft_data();252 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?;279 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;253 Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;280 Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;254281255 }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)282 }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)263 let recipient: T::AccountId = account("recipient", 0, SEED);290 let recipient: T::AccountId = account("recipient", 0, SEED);264 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());291 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());265 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;292 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;293 let data = default_fungible_data();266 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [].to_vec(), caller.clone())?;294 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;267 Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;295 Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;268296269 }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)297 }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)273 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();301 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();274 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();302 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();275 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();303 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();276 let mode: CollectionMode = CollectionMode::ReFungible(3,3);304 let mode: CollectionMode = CollectionMode::ReFungible(3);277 let recipient: T::AccountId = account("recipient", 0, SEED);305 let recipient: T::AccountId = account("recipient", 0, SEED);278 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());306 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());279 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;307 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;308 let data = default_re_fungible_data();280 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?;309 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;281 Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;310 Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;282311283 }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)312 }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)286 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();315 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();287 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();316 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();288 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();317 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();289 let mode: CollectionMode = CollectionMode::ReFungible(3,3);318 let mode: CollectionMode = CollectionMode::ReFungible(3);290 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());319 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());291 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;320 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;292321293 }: set_offchain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())322 }: set_offchain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())323324 set_const_on_chain_schema {325 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();326 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();327 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();328 let mode: CollectionMode = CollectionMode::ReFungible(3);329 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());330 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;331 }: set_const_on_chain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())332 333 set_variable_on_chain_schema {334 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();335 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();336 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();337 let mode: CollectionMode = CollectionMode::ReFungible(3);338 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());339 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;340 }: set_variable_on_chain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())341342 set_variable_meta_data {343 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();344 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();345 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();346 let mode: CollectionMode = CollectionMode::NFT;347 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());348 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;349 let data = default_nft_data();350 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;351352 }: set_variable_meta_data(RawOrigin::Signed(caller.clone()), 2, 1, [1, 2, 3].to_vec())294 }353}pallets/nft/src/default_weights.rsdiffbeforeafterboth92 .saturating_add(DbWeight::get().reads(2 as Weight))92 .saturating_add(DbWeight::get().reads(2 as Weight))93 .saturating_add(DbWeight::get().writes(1 as Weight))93 .saturating_add(DbWeight::get().writes(1 as Weight))94 }94 }95 fn set_const_on_chain_schema() -> Weight {96 (11_100_000 as Weight)97 .saturating_add(DbWeight::get().reads(2 as Weight))98 .saturating_add(DbWeight::get().writes(1 as Weight))99 }100 fn set_variable_on_chain_schema() -> Weight {101 (11_100_000 as Weight)102 .saturating_add(DbWeight::get().reads(2 as Weight))103 .saturating_add(DbWeight::get().writes(1 as Weight))104 }105 fn set_variable_meta_data() -> Weight {106 (17_500_000 as Weight)107 .saturating_add(DbWeight::get().reads(2 as Weight))108 .saturating_add(DbWeight::get().writes(1 as Weight))109 }95}110}96111pallets/nft/src/lib.rsdiffbeforeafterboth10pub use frame_support::{10pub use frame_support::{11 construct_runtime, decl_event, decl_module, decl_storage,11 construct_runtime, decl_event, decl_module, decl_storage,12 dispatch::DispatchResult,12 dispatch::DispatchResult,13 ensure, parameter_types,13 ensure, parameter_types, fail,14 traits::{14 traits::{15 Currency, ExistenceRequirement, Get, Imbalance, KeyOwnerProofSystem, OnUnbalanced,15 Currency, ExistenceRequirement, Get, Imbalance, KeyOwnerProofSystem, OnUnbalanced,16 Randomness, WithdrawReason,16 Randomness, WithdrawReason,53#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]53#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]54pub enum CollectionMode {54pub enum CollectionMode {55 Invalid,55 Invalid,56 // custom data size56 NFT,57 NFT(u32),58 // decimal points57 // decimal points59 Fungible(u32),58 Fungible(u32),60 // custom data size and decimal points59 // decimal points61 ReFungible(u32, u32),60 ReFungible(u32),62}61}636264impl Into<u8> for CollectionMode {63impl Into<u8> for CollectionMode {65 fn into(self) -> u8 {64 fn into(self) -> u8 {66 match self {65 match self {67 CollectionMode::Invalid => 0,66 CollectionMode::Invalid => 0,68 CollectionMode::NFT(_) => 1,67 CollectionMode::NFT => 1,69 CollectionMode::Fungible(_) => 2,68 CollectionMode::Fungible(_) => 2,70 CollectionMode::ReFungible(_, _) => 3,69 CollectionMode::ReFungible(_) => 3,71 }70 }72 }71 }73}72}107 pub name: Vec<u16>, // 64 include null escape char106 pub name: Vec<u16>, // 64 include null escape char108 pub description: Vec<u16>, // 256 include null escape char107 pub description: Vec<u16>, // 256 include null escape char109 pub token_prefix: Vec<u8>, // 16 include null escape char108 pub token_prefix: Vec<u8>, // 16 include null escape char110 pub custom_data_size: u32,111 pub mint_mode: bool,109 pub mint_mode: bool,112 pub offchain_schema: Vec<u8>,110 pub offchain_schema: Vec<u8>,113 pub sponsor: AccountId, // Who pays fees. If set to default address, the fees are applied to the transaction sender111 pub sponsor: AccountId, // Who pays fees. If set to default address, the fees are applied to the transaction sender114 pub unconfirmed_sponsor: AccountId, // Sponsor address that has not yet confirmed sponsorship112 pub unconfirmed_sponsor: AccountId, // Sponsor address that has not yet confirmed sponsorship113 pub variable_on_chain_schema: Vec<u8>, //114 pub const_on_chain_schema: Vec<u8>, //115}115}116116117#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]117#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]126pub struct NftItemType<AccountId> {126pub struct NftItemType<AccountId> {127 pub collection: u64,127 pub collection: u64,128 pub owner: AccountId,128 pub owner: AccountId,129 pub data: Vec<u8>,129 pub const_data: Vec<u8>,130 pub variable_data: Vec<u8>,130}131}131132132#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]133#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]142pub struct ReFungibleItemType<AccountId> {143pub struct ReFungibleItemType<AccountId> {143 pub collection: u64,144 pub collection: u64,144 pub owner: Vec<Ownership<AccountId>>,145 pub owner: Vec<Ownership<AccountId>>,145 pub data: Vec<u8>,146 pub const_data: Vec<u8>,147 pub variable_data: Vec<u8>,146}148}147149148#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]150#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]197 fn set_collection_sponsor() -> Weight;199 fn set_collection_sponsor() -> Weight;198 fn confirm_sponsorship() -> Weight;200 fn confirm_sponsorship() -> Weight;199 fn remove_collection_sponsor() -> Weight;201 fn remove_collection_sponsor() -> Weight;200 fn create_item(s: usize, ) -> Weight;202 fn create_item(s: usize) -> Weight;201 fn burn_item() -> Weight;203 fn burn_item() -> Weight;202 fn transfer() -> Weight;204 fn transfer() -> Weight;203 fn approve() -> Weight;205 fn approve() -> Weight;204 fn transfer_from() -> Weight;206 fn transfer_from() -> Weight;205 fn set_offchain_schema() -> Weight;207 fn set_offchain_schema() -> Weight;208 fn set_const_on_chain_schema() -> Weight;209 fn set_variable_on_chain_schema() -> Weight;210 fn set_variable_meta_data() -> Weight;206}211}207212213#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]214#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]215pub struct CreateNftData {216 pub const_data: Vec<u8>,217 pub variable_data: Vec<u8>,218}219220#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]221#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]222pub struct CreateFungibleData {223}224225#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]226#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]227pub struct CreateReFungibleData {228 pub const_data: Vec<u8>,229 pub variable_data: Vec<u8>,230}231232#[derive(Encode, Decode, Debug, Clone, PartialEq)]233#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]234pub enum CreateItemData {235 NFT(CreateNftData),236 Fungible(CreateFungibleData),237 ReFungible(CreateReFungibleData)238}239240impl CreateItemData {241 pub fn len(&self) -> usize {242 let len = match self {243 CreateItemData::NFT(data) => data.variable_data.len() + data.const_data.len(),244 CreateItemData::ReFungible(data) => data.variable_data.len() + data.const_data.len(),245 _ => 0246 };247 248 return len;249 }250}251208pub trait Trait: system::Trait + Sized {252pub trait Trait: system::Trait + Sized {209 type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;253 type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;210254361405362 // Anyone can create a collection406 // Anyone can create a collection363 let who = ensure_signed(origin)?;407 let who = ensure_signed(origin)?;364 let custom_data_size = match mode {365 CollectionMode::NFT(size) => {366408367 // bound Custom data size368 ensure!(size < ChainLimit::get().custom_data_limit, "Custom data size bound exceeded");369 size370 },371 CollectionMode::ReFungible(size, _) => {372373 // bound Custom data size374 ensure!(size < ChainLimit::get().custom_data_limit, "Custom data size bound exceeded");375 size376 },377 _ => 0378 };379380 let decimal_points = match mode {409 let decimal_points = match mode {381 CollectionMode::Fungible(points) => points,410 CollectionMode::Fungible(points) => points,382 CollectionMode::ReFungible(_, points) => points,411 CollectionMode::ReFungible(points) => points,383 _ => 0412 _ => 0384 };413 };385414425 decimal_points: decimal_points,454 decimal_points: decimal_points,426 token_prefix: prefix,455 token_prefix: prefix,427 offchain_schema: Vec::new(),456 offchain_schema: Vec::new(),428 custom_data_size: custom_data_size,429 sponsor: T::AccountId::default(),457 sponsor: T::AccountId::default(),430 unconfirmed_sponsor: T::AccountId::default(),458 unconfirmed_sponsor: T::AccountId::default(),459 variable_on_chain_schema: Vec::new(),460 const_on_chain_schema: Vec::new(),431 };461 };432462433 // Add new collection to map463 // Add new collection to map440 }470 }441471442 /// **DANGEROUS**: Destroys collection and all NFTs within this collection. Users irrecoverably lose their assets and may lose real money.472 /// **DANGEROUS**: Destroys collection and all NFTs within this collection. Users irrecoverably lose their assets and may lose real money.443 /// 473 /// 444 /// # Permissions474 /// # Permissions445 /// 475 /// 446 /// * Collection Owner.476 /// * Collection Owner.770 /// 800 /// 771 /// * collection_id: ID of the collection.801 /// * collection_id: ID of the collection.772 /// 802 /// 773 /// * 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.774 /// 775 /// * owner: Address, initial owner of the NFT.803 /// * owner: Address, initial owner of the NFT.804 ///805 /// * data: Token data to store on chain.776 // #[weight =806 // #[weight =777 // (130_000_000 as Weight)807 // (130_000_000 as Weight)778 // .saturating_add((2135 as Weight).saturating_mul((properties.len() as u64) as Weight))808 // .saturating_add((2135 as Weight).saturating_mul((properties.len() as u64) as Weight))779 // .saturating_add(RocksDbWeight::get().reads(10 as Weight))809 // .saturating_add(RocksDbWeight::get().reads(10 as Weight))780 // .saturating_add(RocksDbWeight::get().writes(8 as Weight))]810 // .saturating_add(RocksDbWeight::get().writes(8 as Weight))]781811782 #[weight = T::WeightInfo::create_item(properties.len())]812 #[weight = T::WeightInfo::create_item(data.len())]783 pub fn create_item(origin, collection_id: u64, properties: Vec<u8>, owner: T::AccountId) -> DispatchResult {813 pub fn create_item(origin, collection_id: u64, owner: T::AccountId, data: CreateItemData) -> DispatchResult {784814785 let sender = ensure_signed(origin)?;815 let sender = ensure_signed(origin)?;786 Self::collection_exists(collection_id)?;816 Self::collection_exists(collection_id)?;787 let target_collection = <Collection<T>>::get(collection_id);817 let target_collection = <Collection<T>>::get(collection_id);788818789 if !Self::is_owner_or_admin_permissions(collection_id, sender.clone()) {819 if !Self::is_owner_or_admin_permissions(collection_id, sender.clone()) {790 ensure!(target_collection.mint_mode == true, "Public minting is not allowed for this collection");820 ensure!(target_collection.mint_mode == true, "Public minting is not allowed for this collection.");791 Self::check_white_list(collection_id, &owner)?;821 Self::check_white_list(collection_id, &owner)?;792 Self::check_white_list(collection_id, &sender)?;822 Self::check_white_list(collection_id, &sender)?;793 }823 }794824795 match target_collection.mode825 match target_collection.mode796 {826 {797 CollectionMode::NFT(_) => {827 CollectionMode::NFT => {798828 if let CreateItemData::NFT(data) = data {799 // check size829 // check sizes800 ensure!(target_collection.custom_data_size >= properties.len() as u32, "Size of item is too large");830 ensure!(ChainLimit::get().custom_data_limit >= data.const_data.len() as u32, "const_data exceeded data limit.");801831 ensure!(ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32, "variable_data exceeded data limit.");832 802 // Create nft item833 // Create nft item803 let item = NftItemType {834 let item = NftItemType {804 collection: collection_id,835 collection: collection_id,805 owner: owner,836 owner: owner,806 data: properties.clone(),837 const_data: data.const_data.clone(),807 };838 variable_data: data.variable_data.clone() 808839 };840 809 Self::add_nft_item(item)?;841 Self::add_nft_item(item)?;810842 843 } else {844 fail!("Not NFT item data used to mint in NFT collection.");845 }811 },846 },812 CollectionMode::Fungible(_) => {847 CollectionMode::Fungible(_) => {813814 // check size848 if let CreateItemData::Fungible(_) = data {815 ensure!(properties.len() as u32 == 0, "Size of item must be 0 with fungible type");849 816817 let item = FungibleItemType {850 let item = FungibleItemType {818 collection: collection_id,851 collection: collection_id,819 owner: owner,852 owner: owner,820 value: (10 as u128).pow(target_collection.decimal_points)853 value: (10 as u128).pow(target_collection.decimal_points)821 };854 };822855 823 Self::add_fungible_item(item)?;856 Self::add_fungible_item(item)?;857 } else {858 fail!("Not Fungible item data used to mint in Fungible collection.");859 }824 },860 },825 CollectionMode::ReFungible(_, _) => {861 CollectionMode::ReFungible(_) => {826862 if let CreateItemData::ReFungible(data) = data {827 // check size863 864 // check sizes828 ensure!(target_collection.custom_data_size >= properties.len() as u32, "Size of item is too large");865 ensure!(ChainLimit::get().custom_data_limit >= data.const_data.len() as u32, "const_data exceeded data limit.");829866 ensure!(ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32, "variable_data exceeded data limit.");867 830 let mut owner_list = Vec::new();868 let mut owner_list = Vec::new();831 let value = (10 as u128).pow(target_collection.decimal_points);869 let value = (10 as u128).pow(target_collection.decimal_points);832 owner_list.push(Ownership {owner: owner.clone(), fraction: value});870 owner_list.push(Ownership {owner: owner.clone(), fraction: value});833871 834 let item = ReFungibleItemType {872 let item = ReFungibleItemType {835 collection: collection_id,873 collection: collection_id,836 owner: owner_list,874 owner: owner_list,837 data: properties.clone()875 const_data: data.const_data.clone(),876 variable_data: data.variable_data.clone() 838 };877 };839878 840 Self::add_refungible_item(item)?;879 Self::add_refungible_item(item)?;880 } else {881 fail!("Not Re Fungible item data used to mint in Re Fungible collection.");882 }841 },883 },842 _ => { ensure!(1 == 0,"just error"); }884 _ => { ensure!(1 == 0,"Unexpected collection type."); }843844 };885 };845886880921881 match target_collection.mode922 match target_collection.mode882 {923 {883 CollectionMode::NFT(_) => Self::burn_nft_item(collection_id, item_id)?,924 CollectionMode::NFT => Self::burn_nft_item(collection_id, item_id)?,884 CollectionMode::Fungible(_) => Self::burn_fungible_item(collection_id, item_id)?,925 CollectionMode::Fungible(_) => Self::burn_fungible_item(collection_id, item_id)?,885 CollectionMode::ReFungible(_, _) => Self::burn_refungible_item(collection_id, item_id, sender.clone())?,926 CollectionMode::ReFungible(_) => Self::burn_refungible_item(collection_id, item_id, sender.clone())?,886 _ => ()927 _ => ()887 };928 };888929933974934 match target_collection.mode975 match target_collection.mode935 {976 {936 CollectionMode::NFT(_) => Self::transfer_nft(collection_id, item_id, sender.clone(), recipient)?,977 CollectionMode::NFT => Self::transfer_nft(collection_id, item_id, sender.clone(), recipient)?,937 CollectionMode::Fungible(_) => Self::transfer_fungible(collection_id, item_id, value, sender.clone(), recipient)?,978 CollectionMode::Fungible(_) => Self::transfer_fungible(collection_id, item_id, value, sender.clone(), recipient)?,938 CollectionMode::ReFungible(_, _) => Self::transfer_refungible(collection_id, item_id, value, sender.clone(), recipient)?,979 CollectionMode::ReFungible(_) => Self::transfer_refungible(collection_id, item_id, value, sender.clone(), recipient)?,939 _ => ()980 _ => ()940 };981 };941982105010911051 match target_collection.mode1092 match target_collection.mode1052 {1093 {1053 CollectionMode::NFT(_) => Self::transfer_nft(collection_id, item_id, from, recipient)?,1094 CollectionMode::NFT => Self::transfer_nft(collection_id, item_id, from, recipient)?,1054 CollectionMode::Fungible(_) => Self::transfer_fungible(collection_id, item_id, value, from.clone(), recipient)?,1095 CollectionMode::Fungible(_) => Self::transfer_fungible(collection_id, item_id, value, from.clone(), recipient)?,1055 CollectionMode::ReFungible(_, _) => Self::transfer_refungible(collection_id, item_id, value, from.clone(), recipient)?,1096 CollectionMode::ReFungible(_) => Self::transfer_refungible(collection_id, item_id, value, from.clone(), recipient)?,1056 _ => ()1097 _ => ()1057 };1098 };10581099107411151075 Ok(())1116 Ok(())1076 }1117 }1118 1119 /// Set off-chain data schema.1120 /// 1121 /// # Permissions1122 /// 1123 /// * Collection Owner1124 /// * Collection Admin1125 /// 1126 /// # Arguments1127 /// 1128 /// * collection_id.1129 /// 1130 /// * schema: String representing the offchain data schema.1131 #[weight = T::WeightInfo::set_variable_meta_data()]1132 pub fn set_variable_meta_data (1133 origin,1134 collection_id: u64,1135 item_id: u64,1136 data: Vec<u8>1137 ) -> DispatchResult {1138 let sender = ensure_signed(origin)?;1139 1140 Self::collection_exists(collection_id)?;107711411142 // Modify permissions check1143 let target_collection = <Collection<T>>::get(collection_id);1144 ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) ||1145 Self::is_owner_or_admin_permissions(collection_id, sender.clone()),1146 "Only item owner, collection owner and admins can modify item");11471148 Self::item_exists(collection_id, item_id, &target_collection.mode)?;11491150 match target_collection.mode1151 {1152 CollectionMode::NFT => Self::set_nft_variable_data(collection_id, item_id, data)?,1153 CollectionMode::ReFungible(_) => Self::set_re_fungible_variable_data(collection_id, item_id, data)?,1154 _ => ()1155 };11561157 Ok(())1158 }1159 11601078 /// Set off-chain data schema.1161 /// Set off-chain data schema.1079 /// 1162 /// 1080 /// # Permissions1163 /// # Permissions1103 Ok(())1186 Ok(())1104 }1187 }110511881189 /// Set const on-chain data schema.1190 /// 1191 /// # Permissions1192 /// 1193 /// * Collection Owner1194 /// * Collection Admin1195 /// 1196 /// # Arguments1197 /// 1198 /// * collection_id.1199 /// 1200 /// * schema: String representing the const on-chain data schema.1201 #[weight = T::WeightInfo::set_const_on_chain_schema()]1202 pub fn set_const_on_chain_schema (1203 origin,1204 collection_id: u64,1205 schema: Vec<u8>1206 ) -> DispatchResult {1207 let sender = ensure_signed(origin)?;1208 Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;12091210 let mut target_collection = <Collection<T>>::get(collection_id);1211 target_collection.const_on_chain_schema = schema;1212 <Collection<T>>::insert(collection_id, target_collection);12131214 Ok(())1215 }12161217 /// Set variable on-chain data schema.1218 /// 1219 /// # Permissions1220 /// 1221 /// * Collection Owner1222 /// * Collection Admin1223 /// 1224 /// # Arguments1225 /// 1226 /// * collection_id.1227 /// 1228 /// * schema: String representing the variable on-chain data schema.1229 #[weight = T::WeightInfo::set_const_on_chain_schema()]1230 pub fn set_variable_on_chain_schema (1231 origin,1232 collection_id: u64,1233 schema: Vec<u8>1234 ) -> DispatchResult {1235 let sender = ensure_signed(origin)?;1236 Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;12371238 let mut target_collection = <Collection<T>>::get(collection_id);1239 target_collection.variable_on_chain_schema = schema;1240 <Collection<T>>::insert(collection_id, target_collection);12411242 Ok(())1243 }12441106 // Sudo permissions function1245 // Sudo permissions function1107 #[weight = 0]1246 #[weight = 0]1108 pub fn set_chain_limits(1247 pub fn set_chain_limits(1322 let target_collection = <Collection<T>>::get(collection_id);1461 let target_collection = <Collection<T>>::get(collection_id);132314621324 match target_collection.mode {1463 match target_collection.mode {1325 CollectionMode::NFT(_) => {1464 CollectionMode::NFT => {1326 <NftItemList<T>>::get(collection_id, item_id).owner == subject1465 <NftItemList<T>>::get(collection_id, item_id).owner == subject1327 }1466 }1328 CollectionMode::Fungible(_) => {1467 CollectionMode::Fungible(_) => {1329 <FungibleItemList<T>>::get(collection_id, item_id).owner == subject1468 <FungibleItemList<T>>::get(collection_id, item_id).owner == subject1330 }1469 }1331 CollectionMode::ReFungible(_, _) => {1470 CollectionMode::ReFungible(_) => {1332 <ReFungibleItemList<T>>::get(collection_id, item_id)1471 <ReFungibleItemList<T>>::get(collection_id, item_id)1333 .owner1472 .owner1334 .iter()1473 .iter()156117001562 // reset approved list1701 // reset approved list1563 <ApprovedList<T>>::remove(collection_id, (item_id, old_owner));1702 <ApprovedList<T>>::remove(collection_id, (item_id, old_owner));1703 Ok(())1704 }1705 1706 fn item_exists(1707 collection_id: u64,1708 item_id: u64,1709 mode: &CollectionMode1710 ) -> DispatchResult {1711 match mode {1712 CollectionMode::NFT => ensure!(<NftItemList<T>>::contains_key(collection_id, item_id), "Item does not exists"),1713 CollectionMode::ReFungible(_) => ensure!(<ReFungibleItemList<T>>::contains_key(collection_id, item_id), "Item does not exists"),1714 CollectionMode::Fungible(_) => ensure!(<FungibleItemList<T>>::contains_key(collection_id, item_id), "Item does not exists"),1715 _ => ()1716 };1717 1718 Ok(())1719 }17201721 fn set_re_fungible_variable_data(1722 collection_id: u64,1723 item_id: u64,1724 data: Vec<u8>1725 ) -> DispatchResult {1726 let mut item = <ReFungibleItemList<T>>::get(collection_id, item_id);17271728 item.variable_data = data;17291730 <ReFungibleItemList<T>>::insert(collection_id, item_id, item);17311732 Ok(())1733 }17341735 fn set_nft_variable_data(1736 collection_id: u64,1737 item_id: u64,1738 data: Vec<u8>1739 ) -> DispatchResult {1740 let mut item = <NftItemList<T>>::get(collection_id, item_id);1741 1742 item.variable_data = data;17431744 <NftItemList<T>>::insert(collection_id, item_id, item);1745 1564 Ok(())1746 Ok(())1565 }1747 }15661748180419861805 // sponsor timeout1987 // sponsor timeout1806 let sponsor_transfer = match _collection_mode {1988 let sponsor_transfer = match _collection_mode {1807 CollectionMode::NFT(_) => {1989 CollectionMode::NFT => {1808 let basket = <NftTransferBasket<T>>::get(collection_id, _item_id);1990 let basket = <NftTransferBasket<T>>::get(collection_id, _item_id);1809 let block_number = <system::Module<T>>::block_number() as T::BlockNumber;1991 let block_number = <system::Module<T>>::block_number() as T::BlockNumber;1810 let limit_time = basket + ChainLimit::get().nft_sponsor_transfer_timeout.into();1992 let limit_time = basket + ChainLimit::get().nft_sponsor_transfer_timeout.into();1838 true2020 true1839 }2021 }1840 }2022 }1841 CollectionMode::ReFungible(_, _) => {2023 CollectionMode::ReFungible(_) => {1842 let basket = <ReFungibleTransferBasket<T>>::get(collection_id, _item_id);2024 let basket = <ReFungibleTransferBasket<T>>::get(collection_id, _item_id);1843 let block_number = <system::Module<T>>::block_number() as T::BlockNumber;2025 let block_number = <system::Module<T>>::block_number() as T::BlockNumber;1844 let limit_time = basket + ChainLimit::get().nft_sponsor_transfer_timeout.into();2026 let limit_time = basket + ChainLimit::get().nft_sponsor_transfer_timeout.into();pallets/nft/src/tests.rsdiffbeforeafterboth1// Tests to be written here1// Tests to be written here2use crate::mock::*;2use crate::mock::*;3use crate::{AccessMode, ApprovePermissions, CollectionMode, Ownership, ChainLimits};3use crate::{AccessMode, ApprovePermissions, CollectionMode, Ownership, ChainLimits, CreateItemData, NftItemType, CreateNftData, CreateFungibleData, CreateReFungibleData};4use frame_support::{assert_noop, assert_ok};4use frame_support::{assert_noop, assert_ok};5use frame_system::{ RawOrigin };5use frame_system::{ RawOrigin };667// Use cases tests region8// #region9#[test]10fn create_nft_item() {7fn default_collection_numbers_limit() -> u64 {11 new_test_ext().execute_with(|| {12 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();8 1013 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();9}14 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();15 let mode: CollectionMode = CollectionMode::NFT(2000);161017 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 11fn default_limits() {12 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 18 collection_numbers_limit: 10,13 collection_numbers_limit: default_collection_numbers_limit(),19 account_token_ownership_limit: 10,14 account_token_ownership_limit: 10,20 collections_admins_limit: 5,15 collections_admins_limit: 5,21 custom_data_limit: 2048,16 custom_data_limit: 2048,22 nft_sponsor_transfer_timeout: 15,17 nft_sponsor_transfer_timeout: 15,23 fungible_sponsor_transfer_timeout: 15,18 fungible_sponsor_transfer_timeout: 15,24 refungible_sponsor_transfer_timeout: 15, 19 refungible_sponsor_transfer_timeout: 15, 25 }));20 }));21}262227 let origin1 = Origin::signed(1);23fn default_nft_data() -> CreateItemData {24 CreateItemData::NFT(CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] })25}2627fn default_fungible_data () -> CreateItemData {28 CreateItemData::Fungible(CreateFungibleData { })29}3031fn default_re_fungible_data () -> CreateItemData {32 CreateItemData::ReFungible(CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] })33}3435fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64) -> u64 {36 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();28 assert_ok!(TemplateModule::create_collection(37 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();38 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();3940 let collection_id = TemplateModule::nextCollectionID();41 let origin1 = Origin::signed(owner);42 assert_ok!(TemplateModule::create_collection(29 origin1.clone(),43 origin1.clone(),30 col_name1.clone(),44 col_name1.clone(),31 col_desc1.clone(),45 col_desc1.clone(),32 token_prefix1.clone(),46 token_prefix1.clone(),33 mode47 mode34 ));48 ));35 assert_eq!(TemplateModule::collection(1).owner, 1);49 assert_eq!(TemplateModule::collection(collection_id).owner, owner);50 return collection_id;51}365237 assert_ok!(TemplateModule::create_item(53fn create_test_collection(mode: &CollectionMode) -> u64 {54 return create_test_collection_for_owner(&mode, 1);55}5657fn create_test_item(collection_id: u64, data: &CreateItemData) {58 let origin1 = Origin::signed(1);59 assert_ok!(TemplateModule::create_item(38 origin1.clone(),60 origin1.clone(),61 collection_id,39 1,62 1,40 [1, 2, 3].to_vec(),63 data.clone()41 142 ));64 ));6566}6743 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());68// Use cases tests region69// #region70#[test]71fn create_nft_item() {72 new_test_ext().execute_with(|| {73 default_limits();74 let collection_id = create_test_collection(&CollectionMode::NFT);7576 let data = default_nft_data();77 create_test_item(collection_id, &data);78 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).const_data, data.const_data);79 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, data.variable_data);44 });80 });45}81}468247#[test]83#[test]48fn create_refungible_item() {84fn create_refungible_item() {49 new_test_ext().execute_with(|| {85 new_test_ext().execute_with(|| {50 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();86 default_limits();51 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();87 let collection_id = create_test_collection(&CollectionMode::ReFungible(3));52 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();53 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);548855 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 89 let data = default_re_fungible_data();56 collection_numbers_limit: 10,57 account_token_ownership_limit: 10,58 collections_admins_limit: 5,59 custom_data_limit: 2048,60 nft_sponsor_transfer_timeout: 15,61 fungible_sponsor_transfer_timeout: 15,62 refungible_sponsor_transfer_timeout: 15, 63 }));6465 let origin1 = Origin::signed(1);66 assert_ok!(TemplateModule::create_collection(90 create_test_item(collection_id, &data);67 origin1.clone(),68 col_name1.clone(),69 col_desc1.clone(),70 token_prefix1.clone(),71 mode72 ));73 assert_eq!(TemplateModule::collection(1).owner, 1);7475 assert_ok!(TemplateModule::create_item(76 origin1.clone(),77 1,78 [1, 2, 3].to_vec(),79 180 ));81 assert_eq!(91 assert_eq!(82 TemplateModule::refungible_item_id(1, 1).data,92 TemplateModule::refungible_item_id(collection_id, 1).const_data,83 [1, 2, 3].to_vec()93 data.const_data84 );94 );85 assert_eq!(95 assert_eq!(86 TemplateModule::refungible_item_id(1, 1).owner[0],96 TemplateModule::refungible_item_id(collection_id, 1).variable_data,97 data.variable_data98 );99 assert_eq!(100 TemplateModule::refungible_item_id(collection_id, 1).owner[0],87 Ownership {101 Ownership {88 owner: 1,102 owner: 1,89 fraction: 1000103 fraction: 100095#[test]109#[test]96fn create_fungible_item() {110fn create_fungible_item() {97 new_test_ext().execute_with(|| {111 new_test_ext().execute_with(|| {98 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();112 let collection_id = create_test_collection(&CollectionMode::Fungible(3));99 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();100 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();101 let mode: CollectionMode = CollectionMode::Fungible(3);102113103 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 114 let data = default_fungible_data();104 collection_numbers_limit: 10,115 create_test_item(collection_id, &data);105 account_token_ownership_limit: 10,106 collections_admins_limit: 5,107 custom_data_limit: 2048,108 nft_sponsor_transfer_timeout: 15,109 fungible_sponsor_transfer_timeout: 15,110 refungible_sponsor_transfer_timeout: 15, 111 }));112116113 let origin1 = Origin::signed(1);117 assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).owner, 1);114 assert_ok!(TemplateModule::create_collection(115 origin1.clone(),116 col_name1.clone(),117 col_desc1.clone(),118 token_prefix1.clone(),119 mode120 ));121 assert_eq!(TemplateModule::collection(1).owner, 1);122123 assert_ok!(TemplateModule::create_item(124 origin1.clone(),125 1,126 [].to_vec(),127 1128 ));129 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);130 assert_eq!(TemplateModule::balance_count(1, 1), 1000);118 assert_eq!(TemplateModule::balance_count(1, 1), 1000);131 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);119 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);132 });120 });135#[test]123#[test]136fn transfer_fungible_item() {124fn transfer_fungible_item() {137 new_test_ext().execute_with(|| {125 new_test_ext().execute_with(|| {138 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();126 default_limits();139 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();127 140 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();128 let collection_id = create_test_collection(&CollectionMode::Fungible(3));141 let mode: CollectionMode = CollectionMode::Fungible(3);142129143 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 144 collection_numbers_limit: 10,145 account_token_ownership_limit: 10,146 collections_admins_limit: 5,147 custom_data_limit: 2048,148 nft_sponsor_transfer_timeout: 15,149 fungible_sponsor_transfer_timeout: 15,150 refungible_sponsor_transfer_timeout: 15, 151 }));152153 let origin1 = Origin::signed(1);130 let origin1 = Origin::signed(1);154 let origin2 = Origin::signed(2);131 let origin2 = Origin::signed(2);155 assert_ok!(TemplateModule::create_collection(156 origin1.clone(),157 col_name1.clone(),158 col_desc1.clone(),159 token_prefix1.clone(),160 mode161 ));162 assert_eq!(TemplateModule::collection(1).owner, 1);163132164 assert_ok!(TemplateModule::create_item(133 let data = default_fungible_data();165 origin1.clone(),166 1,134 create_test_item(collection_id, &data);167 [].to_vec(),135168 1169 ));170 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);136 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);171 assert_eq!(TemplateModule::balance_count(1, 1), 1000);137 assert_eq!(TemplateModule::balance_count(1, 1), 1000);172 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);138 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);203#[test]169#[test]204fn transfer_refungible_item() {170fn transfer_refungible_item() {205 new_test_ext().execute_with(|| {171 new_test_ext().execute_with(|| {206 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();172 default_limits();207 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();173 208 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();174 let collection_id = create_test_collection(&CollectionMode::ReFungible(3));209 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);210175211 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 176 let data = default_re_fungible_data();212 collection_numbers_limit: 10,177 create_test_item(collection_id, &data);213 account_token_ownership_limit: 10,214 collections_admins_limit: 5,215 custom_data_limit: 2048,216 nft_sponsor_transfer_timeout: 15,217 fungible_sponsor_transfer_timeout: 15,218 refungible_sponsor_transfer_timeout: 15, 219 }));220178221 let origin1 = Origin::signed(1);179 let origin1 = Origin::signed(1);222 let origin2 = Origin::signed(2);180 let origin2 = Origin::signed(2);223 assert_ok!(TemplateModule::create_collection(224 origin1.clone(),225 col_name1.clone(),226 col_desc1.clone(),227 token_prefix1.clone(),228 mode229 ));230 assert_eq!(TemplateModule::collection(1).owner, 1);231232 assert_ok!(TemplateModule::create_item(233 origin1.clone(),234 1,235 [1, 2, 3].to_vec(),236 1237 ));238 assert_eq!(181 assert_eq!(239 TemplateModule::refungible_item_id(1, 1).data,182 TemplateModule::refungible_item_id(collection_id, 1).const_data,240 [1, 2, 3].to_vec()183 data.const_data241 );184 );242 assert_eq!(185 assert_eq!(243 TemplateModule::refungible_item_id(1, 1).owner[0],186 TemplateModule::refungible_item_id(collection_id, 1).variable_data,187 data.variable_data188 );189 assert_eq!(190 TemplateModule::refungible_item_id(collection_id, 1).owner[0],244 Ownership {191 Ownership {245 owner: 1,192 owner: 1,246 fraction: 1000193 fraction: 1000310#[test]257#[test]311fn transfer_nft_item() {258fn transfer_nft_item() {312 new_test_ext().execute_with(|| {259 new_test_ext().execute_with(|| {313 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();260 default_limits();314 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();261 315 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();262 let collection_id = create_test_collection(&CollectionMode::NFT);316 let mode: CollectionMode = CollectionMode::NFT(2000);317263318 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 264 let data = default_nft_data();319 collection_numbers_limit: 10,320 account_token_ownership_limit: 10,321 collections_admins_limit: 5,322 custom_data_limit: 2048,323 nft_sponsor_transfer_timeout: 15,324 fungible_sponsor_transfer_timeout: 15,325 refungible_sponsor_transfer_timeout: 15, 326 }));327328 let origin1 = Origin::signed(1);329 assert_ok!(TemplateModule::create_collection(265 create_test_item(collection_id, &data);330 origin1.clone(),331 col_name1.clone(),332 col_desc1.clone(),333 token_prefix1.clone(),334 mode335 ));336 assert_eq!(TemplateModule::collection(1).owner, 1);337338 assert_ok!(TemplateModule::create_item(339 origin1.clone(),340 1,341 [1, 2, 3].to_vec(),342 1343 ));344 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());345 assert_eq!(TemplateModule::balance_count(1, 1), 1);266 assert_eq!(TemplateModule::balance_count(1, 1), 1);346 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);267 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);347268358#[test]279#[test]359fn nft_approve_and_transfer_from() {280fn nft_approve_and_transfer_from() {360 new_test_ext().execute_with(|| {281 new_test_ext().execute_with(|| {361 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();282 default_limits();362 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();283 363 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();284 let collection_id = create_test_collection(&CollectionMode::NFT);364 let mode: CollectionMode = CollectionMode::NFT(2000);365285366 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 286 let data = default_nft_data();367 collection_numbers_limit: 10,287 create_test_item(collection_id, &data);368 account_token_ownership_limit: 10,369 collections_admins_limit: 5,370 custom_data_limit: 2048,371 nft_sponsor_transfer_timeout: 15,372 fungible_sponsor_transfer_timeout: 15,373 refungible_sponsor_transfer_timeout: 15, 374 }));375288376 let origin1 = Origin::signed(1);289 let origin1 = Origin::signed(1);377 let origin2 = Origin::signed(2);290 let origin2 = Origin::signed(2);378 assert_ok!(TemplateModule::create_collection(379 origin1.clone(),380 col_name1.clone(),381 col_desc1.clone(),382 token_prefix1.clone(),383 mode384 ));385 assert_eq!(TemplateModule::collection(1).owner, 1);386291387 assert_ok!(TemplateModule::create_item(388 origin1.clone(),389 1,390 [1, 2, 3].to_vec(),391 1392 ));393 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());394 assert_eq!(TemplateModule::balance_count(1, 1), 1);292 assert_eq!(TemplateModule::balance_count(1, 1), 1);395 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);293 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);396294436#[test]334#[test]437fn refungible_approve_and_transfer_from() {335fn refungible_approve_and_transfer_from() {438 new_test_ext().execute_with(|| {336 new_test_ext().execute_with(|| {439 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();337 default_limits();440 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();338 441 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();339 let collection_id = create_test_collection(&CollectionMode::ReFungible(3));442 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);443444 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 340 445 collection_numbers_limit: 10,446 account_token_ownership_limit: 10,447 collections_admins_limit: 5,448 custom_data_limit: 2048,449 nft_sponsor_transfer_timeout: 15,450 fungible_sponsor_transfer_timeout: 15,451 refungible_sponsor_transfer_timeout: 15, 452 }));453454 let origin1 = Origin::signed(1);341 let origin1 = Origin::signed(1);455 let origin2 = Origin::signed(2);342 let origin2 = Origin::signed(2);456 assert_ok!(TemplateModule::create_collection(457 origin1.clone(),458 col_name1.clone(),459 col_desc1.clone(),460 token_prefix1.clone(),461 mode462 ));463 assert_eq!(TemplateModule::collection(1).owner, 1);464343465 assert_ok!(TemplateModule::create_item(344 let data = default_re_fungible_data();466 origin1.clone(),467 1,468 [1, 2, 3].to_vec(),469 1470 ));471 assert_eq!(345 create_test_item(collection_id, &data);472 TemplateModule::refungible_item_id(1, 1).data,346473 [1, 2, 3].to_vec()474 );475 assert_eq!(476 TemplateModule::refungible_item_id(1, 1).owner[0],477 Ownership {478 owner: 1,479 fraction: 1000480 }481 );482 assert_eq!(TemplateModule::balance_count(1, 1), 1000);347 assert_eq!(TemplateModule::balance_count(1, 1), 1000);483 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);348 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);484349536#[test]401#[test]537fn fungible_approve_and_transfer_from() {402fn fungible_approve_and_transfer_from() {538 new_test_ext().execute_with(|| {403 new_test_ext().execute_with(|| {539 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();404 default_limits();405 540 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();406 let collection_id = create_test_collection(&CollectionMode::Fungible(3));541 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();407 408 let data = default_fungible_data();542 let mode: CollectionMode = CollectionMode::Fungible(3);409 create_test_item(collection_id, &data);543410544 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 545 collection_numbers_limit: 10,546 account_token_ownership_limit: 10,547 collections_admins_limit: 5,548 custom_data_limit: 2048,549 nft_sponsor_transfer_timeout: 15,550 fungible_sponsor_transfer_timeout: 15,551 refungible_sponsor_transfer_timeout: 15, 552 }));553554 let origin1 = Origin::signed(1);411 let origin1 = Origin::signed(1);555 let origin2 = Origin::signed(2);412 let origin2 = Origin::signed(2);556 assert_ok!(TemplateModule::create_collection(557 origin1.clone(),558 col_name1.clone(),559 col_desc1.clone(),560 token_prefix1.clone(),561 mode562 ));563 assert_eq!(TemplateModule::collection(1).owner, 1);564413565 assert_ok!(TemplateModule::create_item(566 origin1.clone(),567 1,568 [].to_vec(),569 1570 ));571 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);572 assert_eq!(TemplateModule::balance_count(1, 1), 1000);414 assert_eq!(TemplateModule::balance_count(1, 1), 1000);573 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);415 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);574416642#[test]484#[test]643fn change_collection_owner() {485fn change_collection_owner() {644 new_test_ext().execute_with(|| {486 new_test_ext().execute_with(|| {645 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();487 default_limits();646 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();488 647 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();489 let collection_id = create_test_collection(&CollectionMode::NFT);648 let mode: CollectionMode = CollectionMode::NFT(2000);649650 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 490 651 collection_numbers_limit: 10,652 account_token_ownership_limit: 10,653 collections_admins_limit: 5,654 custom_data_limit: 2048,655 nft_sponsor_transfer_timeout: 15,656 fungible_sponsor_transfer_timeout: 15,657 refungible_sponsor_transfer_timeout: 15, 658 }));659660 let origin1 = Origin::signed(1);491 let origin1 = Origin::signed(1);661 assert_ok!(TemplateModule::create_collection(662 origin1.clone(),663 col_name1.clone(),664 col_desc1.clone(),665 token_prefix1.clone(),666 mode667 ));668 assert_ok!(TemplateModule::change_collection_owner(492 assert_ok!(TemplateModule::change_collection_owner(669 origin1.clone(),493 origin1.clone(),670 1,494 collection_id,671 2495 2672 ));496 ));673 assert_eq!(TemplateModule::collection(1).owner, 2);497 assert_eq!(TemplateModule::collection(collection_id).owner, 2);674 });498 });675}499}676500677#[test]501#[test]678fn destroy_collection() {502fn destroy_collection() {679 new_test_ext().execute_with(|| {503 new_test_ext().execute_with(|| {680 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();504 default_limits();681 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();505 682 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();506 let collection_id = create_test_collection(&CollectionMode::NFT);683 let mode: CollectionMode = CollectionMode::NFT(2000);684685 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 507 686 collection_numbers_limit: 10,687 account_token_ownership_limit: 10,688 collections_admins_limit: 5,689 custom_data_limit: 2048,690 nft_sponsor_transfer_timeout: 15,691 fungible_sponsor_transfer_timeout: 15,692 refungible_sponsor_transfer_timeout: 15, 693 }));694695 let origin1 = Origin::signed(1);508 let origin1 = Origin::signed(1);696 assert_ok!(TemplateModule::create_collection(509 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));697 origin1.clone(),698 col_name1.clone(),699 col_desc1.clone(),700 token_prefix1.clone(),701 mode702 ));703 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));704 });510 });705}511}706512707#[test]513#[test]708fn burn_nft_item() {514fn burn_nft_item() {709 new_test_ext().execute_with(|| {515 new_test_ext().execute_with(|| {710 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();516 default_limits();711 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();517 712 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();518 let collection_id = create_test_collection(&CollectionMode::NFT);713 let mode: CollectionMode = CollectionMode::NFT(2000);714519715 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 716 collection_numbers_limit: 10,717 account_token_ownership_limit: 10,718 collections_admins_limit: 5,719 custom_data_limit: 2048,720 nft_sponsor_transfer_timeout: 15,721 fungible_sponsor_transfer_timeout: 15,722 refungible_sponsor_transfer_timeout: 15, 723 }));724725 let origin1 = Origin::signed(1);520 let origin1 = Origin::signed(1);726 assert_ok!(TemplateModule::create_collection(521 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));727 origin1.clone(),728 col_name1.clone(),729 col_desc1.clone(),730 token_prefix1.clone(),731 mode732 ));733 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));734 assert_ok!(TemplateModule::create_item(522 735 origin1.clone(),523 let data = default_nft_data();736 1,524 create_test_item(collection_id, &data);737 [1, 2, 3].to_vec(),738 1739 ));740525741 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());742743 // check balance (collection with id = 1, user id = 1)526 // check balance (collection with id = 1, user id = 1)744 assert_eq!(TemplateModule::balance_count(1, 1), 1);527 assert_eq!(TemplateModule::balance_count(1, 1), 1);745528757#[test]540#[test]758fn burn_fungible_item() {541fn burn_fungible_item() {759 new_test_ext().execute_with(|| {542 new_test_ext().execute_with(|| {760 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();543 default_limits();761 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();544 762 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();545 let collection_id = create_test_collection(&CollectionMode::Fungible(3));763 let mode: CollectionMode = CollectionMode::Fungible(3);764765 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 546 766 collection_numbers_limit: 10,767 account_token_ownership_limit: 10,768 collections_admins_limit: 5,769 custom_data_limit: 2048,770 nft_sponsor_transfer_timeout: 15,771 fungible_sponsor_transfer_timeout: 15,772 refungible_sponsor_transfer_timeout: 15, 773 }));774775 let origin1 = Origin::signed(1);547 let origin1 = Origin::signed(1);776 assert_ok!(TemplateModule::create_collection(548 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));777 origin1.clone(),778 col_name1.clone(),779 col_desc1.clone(),780 token_prefix1.clone(),781 mode782 ));783 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));784 assert_ok!(TemplateModule::create_item(549 785 origin1.clone(),550 let data = default_fungible_data();786 1,551 create_test_item(collection_id, &data);787 [].to_vec(),788 1789 ));790552791 // check balance (collection with id = 1, user id = 1)553 // check balance (collection with id = 1, user id = 1)792 assert_eq!(TemplateModule::balance_count(1, 1), 1000);554 assert_eq!(TemplateModule::balance_count(1, 1), 1000);805#[test]567#[test]806fn burn_refungible_item() {568fn burn_refungible_item() {807 new_test_ext().execute_with(|| {569 new_test_ext().execute_with(|| {808 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();570 default_limits();809 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();571 810 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();572 let collection_id = create_test_collection(&CollectionMode::ReFungible(3));811 let mode: CollectionMode = CollectionMode::ReFungible(200, 3);812813 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 814 collection_numbers_limit: 10,815 account_token_ownership_limit: 10,816 collections_admins_limit: 5,817 custom_data_limit: 2048,818 nft_sponsor_transfer_timeout: 15,819 fungible_sponsor_transfer_timeout: 15,820 refungible_sponsor_transfer_timeout: 15, 821 }));822823 let origin1 = Origin::signed(1);573 let origin1 = Origin::signed(1);824 let origin2 = Origin::signed(2);574 let origin2 = Origin::signed(2);825 assert_ok!(TemplateModule::create_collection(826 origin1.clone(),827 col_name1.clone(),828 col_desc1.clone(),829 token_prefix1.clone(),830 mode831 ));832575833 assert_ok!(TemplateModule::set_mint_permission(576 assert_ok!(TemplateModule::set_mint_permission(834 origin1.clone(),577 origin1.clone(),835 1,578 collection_id,836 true579 true837 ));580 ));838 assert_ok!(TemplateModule::set_public_access_mode(581 assert_ok!(TemplateModule::set_public_access_mode(839 origin1.clone(),582 origin1.clone(),840 1,583 collection_id,841 AccessMode::WhiteList584 AccessMode::WhiteList842 ));585 ));843 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));586 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));844587845 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));588 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));846 assert_ok!(TemplateModule::create_item(589 847 origin2.clone(),590 let data = default_re_fungible_data();848 1,591 create_test_item(collection_id, &data);849 [1, 2, 3].to_vec(),850 1851 ));852592853 assert_eq!(854 TemplateModule::refungible_item_id(1, 1).data,855 [1, 2, 3].to_vec()856 );857858 // check balance (collection with id = 1, user id = 2)593 // check balance (collection with id = 1, user id = 2)859 assert_eq!(TemplateModule::balance_count(1, 1), 1000);594 assert_eq!(TemplateModule::balance_count(1, 1), 1000);860595872#[test]607#[test]873fn add_collection_admin() {608fn add_collection_admin() {874 new_test_ext().execute_with(|| {609 new_test_ext().execute_with(|| {875 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();610 default_limits();876 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();611 877 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();612 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1);878 let mode: CollectionMode = CollectionMode::NFT(2000);879880 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 613 create_test_collection_for_owner(&CollectionMode::NFT, 2);881 collection_numbers_limit: 10,614 create_test_collection_for_owner(&CollectionMode::NFT, 3);882 account_token_ownership_limit: 10,883 collections_admins_limit: 5,884 custom_data_limit: 2048,615 885 nft_sponsor_transfer_timeout: 15,886 fungible_sponsor_transfer_timeout: 15,887 refungible_sponsor_transfer_timeout: 15, 888 }));889890 let origin1 = Origin::signed(1);616 let origin1 = Origin::signed(1);891 let origin2 = Origin::signed(2);892 let origin3 = Origin::signed(3);893 assert_ok!(TemplateModule::create_collection(894 origin1.clone(),895 col_name1.clone(),896 col_desc1.clone(),897 token_prefix1.clone(),898 mode.clone()899 ));900 assert_ok!(TemplateModule::create_collection(901 origin2.clone(),902 col_name1.clone(),903 col_desc1.clone(),904 token_prefix1.clone(),905 mode.clone()906 ));907 assert_ok!(TemplateModule::create_collection(908 origin3.clone(),909 col_name1.clone(),910 col_desc1.clone(),911 token_prefix1.clone(),912 mode.clone()913 ));914617915 assert_eq!(TemplateModule::collection(1).owner, 1);916 assert_eq!(TemplateModule::collection(2).owner, 2);917 assert_eq!(TemplateModule::collection(3).owner, 3);918919 // collection admin618 // collection admin920 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));619 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));921 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));620 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));922621923 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);622 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&2), true);924 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);623 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&3), true);925 });624 });926}625}927626928#[test]627#[test]929fn remove_collection_admin() {628fn remove_collection_admin() {930 new_test_ext().execute_with(|| {629 new_test_ext().execute_with(|| {931 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();630 default_limits();631 932 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();632 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1);933 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();633 create_test_collection_for_owner(&CollectionMode::NFT, 2);934 let mode: CollectionMode = CollectionMode::NFT(2000);634 create_test_collection_for_owner(&CollectionMode::NFT, 3);935635936 let origin1 = Origin::signed(1);636 let origin1 = Origin::signed(1);937 let origin2 = Origin::signed(2);637 let origin2 = Origin::signed(2);938 let origin3 = Origin::signed(3);939638940 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 941 collection_numbers_limit: 10,942 account_token_ownership_limit: 10,943 collections_admins_limit: 5,944 custom_data_limit: 2048,945 nft_sponsor_transfer_timeout: 15,946 fungible_sponsor_transfer_timeout: 15,947 refungible_sponsor_transfer_timeout: 15, 948 }));949950 assert_ok!(TemplateModule::create_collection(951 origin1.clone(),952 col_name1.clone(),953 col_desc1.clone(),954 token_prefix1.clone(),955 mode.clone()956 ));957 assert_ok!(TemplateModule::create_collection(958 origin2.clone(),959 col_name1.clone(),960 col_desc1.clone(),961 token_prefix1.clone(),962 mode.clone()963 ));964 assert_ok!(TemplateModule::create_collection(965 origin3.clone(),966 col_name1.clone(),967 col_desc1.clone(),968 token_prefix1.clone(),969 mode.clone()970 ));971972 assert_eq!(TemplateModule::collection(1).owner, 1);973 assert_eq!(TemplateModule::collection(2).owner, 2);974 assert_eq!(TemplateModule::collection(3).owner, 3);975976 // collection admin639 // collection admin977 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));640 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));978 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));641 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));979642980 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);643 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);981 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);644 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);993#[test]656#[test]994fn balance_of() {657fn balance_of() {995 new_test_ext().execute_with(|| {658 new_test_ext().execute_with(|| {996 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();659 default_limits();997 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();660 998 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();661 let nft_collection_id = create_test_collection(&CollectionMode::NFT);999 let nft_mode: CollectionMode = CollectionMode::NFT(2000);662 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3));1000 let furg_mode: CollectionMode = CollectionMode::Fungible(3);663 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3));1001 let refung_mode: CollectionMode = CollectionMode::ReFungible(2000, 3);664 10021003 let origin1 = Origin::signed(1);665 let origin1 = Origin::signed(1);10046661005 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1006 collection_numbers_limit: 10,1007 account_token_ownership_limit: 10,1008 collections_admins_limit: 5,1009 custom_data_limit: 2048,1010 nft_sponsor_transfer_timeout: 15,1011 fungible_sponsor_transfer_timeout: 15,1012 refungible_sponsor_transfer_timeout: 15, 1013 }));10141015 assert_ok!(TemplateModule::create_collection(1016 origin1.clone(),1017 col_name1.clone(),1018 col_desc1.clone(),1019 token_prefix1.clone(),1020 nft_mode.clone()1021 ));1022 assert_ok!(TemplateModule::create_collection(1023 origin1.clone(),1024 col_name1.clone(),1025 col_desc1.clone(),1026 token_prefix1.clone(),1027 furg_mode.clone()1028 ));1029 assert_ok!(TemplateModule::create_collection(1030 origin1.clone(),1031 col_name1.clone(),1032 col_desc1.clone(),1033 token_prefix1.clone(),1034 refung_mode.clone()1035 ));10361037 assert_eq!(TemplateModule::collection(1).owner, 1);1038 assert_eq!(TemplateModule::collection(2).owner, 1);1039 assert_eq!(TemplateModule::collection(3).owner, 1);10401041 // check balance before667 // check balance before1042 assert_eq!(TemplateModule::balance_count(1, 1), 0);668 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);1043 assert_eq!(TemplateModule::balance_count(2, 1), 0);669 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);1044 assert_eq!(TemplateModule::balance_count(3, 1), 0);670 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 0);10456711046 // create item672 let nft_data = default_nft_data();1047 assert_ok!(TemplateModule::create_item(673 create_test_item(nft_collection_id, &nft_data);1048 origin1.clone(),674 1049 1,675 let fungible_data = default_fungible_data();1050 [1, 1, 1].to_vec(),676 create_test_item(fungible_collection_id, &fungible_data);677 1051 1678 let re_fungible_data = default_re_fungible_data();1052 ));679 create_test_item(re_fungible_collection_id, &re_fungible_data);10536801054 assert_ok!(TemplateModule::create_item(1055 origin1.clone(),1056 2,1057 [].to_vec(),1058 11059 ));10601061 assert_ok!(TemplateModule::create_item(1062 origin1.clone(),1063 3,1064 [1, 1, 1].to_vec(),1065 11066 ));10671068 // check balance (collection with id = 1, user id = 1)681 // check balance (collection with id = 1, user id = 1)1069 assert_eq!(TemplateModule::balance_count(1, 1), 1);682 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);1070 assert_eq!(TemplateModule::balance_count(2, 1), 1000);683 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 1000);1071 assert_eq!(TemplateModule::balance_count(3, 1), 1000);684 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1000);1072 assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 1);685 assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1);1073 assert_eq!(TemplateModule::fungible_item_id(2, 1).owner, 1);686 assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).owner, 1);1074 assert_eq!(TemplateModule::refungible_item_id(3, 1).owner[0].owner, 1);687 assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1);1075 });688 });1076}689}10776901078#[test]691#[test]1079fn approve() {692fn approve() {1080 new_test_ext().execute_with(|| {693 new_test_ext().execute_with(|| {1081 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();694 default_limits();695 1082 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();696 let collection_id = create_test_collection(&CollectionMode::NFT);1083 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();697 1084 let nft_mode: CollectionMode = CollectionMode::NFT(2000);698 let data = default_nft_data();1085 let origin1 = Origin::signed(1);699 create_test_item(collection_id, &data);10867001087 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 701 let origin1 = Origin::signed(1);1088 collection_numbers_limit: 10,1089 account_token_ownership_limit: 10,1090 collections_admins_limit: 5,1091 custom_data_limit: 2048,1092 nft_sponsor_transfer_timeout: 15,1093 fungible_sponsor_transfer_timeout: 15,1094 refungible_sponsor_transfer_timeout: 15, 1095 }));10961097 assert_ok!(TemplateModule::create_collection(1098 origin1.clone(),1099 col_name1.clone(),1100 col_desc1.clone(),1101 token_prefix1.clone(),1102 nft_mode.clone()1103 ));11041105 assert_eq!(TemplateModule::collection(1).owner, 1);11061107 // create item702 1108 assert_ok!(TemplateModule::create_item(1109 origin1.clone(),1110 1,1111 [1, 1, 1].to_vec(),1112 11113 ));11141115 // approve703 // approve1116 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));704 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));1121#[test]709#[test]1122fn transfer_from() {710fn transfer_from() {1123 new_test_ext().execute_with(|| {711 new_test_ext().execute_with(|| {1124 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();712 default_limits();1125 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();713 1126 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();714 let collection_id = create_test_collection(&CollectionMode::NFT);1127 let mode: CollectionMode = CollectionMode::NFT(2000);1128 let origin1 = Origin::signed(1);715 let origin1 = Origin::signed(1);1129 let origin2 = Origin::signed(2);716 let origin2 = Origin::signed(2);11307171131 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 718 let data = default_nft_data();1132 collection_numbers_limit: 10,719 create_test_item(collection_id, &data);1133 account_token_ownership_limit: 10,1134 collections_admins_limit: 5,1135 custom_data_limit: 2048,1136 nft_sponsor_transfer_timeout: 15,1137 fungible_sponsor_transfer_timeout: 15,1138 refungible_sponsor_transfer_timeout: 15, 1139 }));11407201141 assert_ok!(TemplateModule::create_collection(1142 origin1.clone(),1143 col_name1.clone(),1144 col_desc1.clone(),1145 token_prefix1.clone(),1146 mode1147 ));11481149 assert_eq!(TemplateModule::collection(1).owner, 1);11501151 // create item1152 assert_ok!(TemplateModule::create_item(1153 origin1.clone(),1154 1,1155 [1, 1, 1].to_vec(),1156 11157 ));11581159 // approve721 // approve1160 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));722 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));1161 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);723 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);1197#[test]759#[test]1198fn owner_can_add_address_to_white_list() {760fn owner_can_add_address_to_white_list() {1199 new_test_ext().execute_with(|| {761 new_test_ext().execute_with(|| {1200 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();762 default_limits();1201 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();763 1202 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();764 let collection_id = create_test_collection(&CollectionMode::NFT);1203 let mode: CollectionMode = CollectionMode::NFT(2000);1204 let origin1 = Origin::signed(1);12057651206 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 766 let origin1 = Origin::signed(1);1207 collection_numbers_limit: 10,1208 account_token_ownership_limit: 10,1209 collections_admins_limit: 5,1210 custom_data_limit: 2048,1211 nft_sponsor_transfer_timeout: 15,1212 fungible_sponsor_transfer_timeout: 15,1213 refungible_sponsor_transfer_timeout: 15, 1214 }));12151216 assert_ok!(TemplateModule::create_collection(1217 origin1.clone(),1218 col_name1.clone(),1219 col_desc1.clone(),1220 token_prefix1.clone(),1221 mode1222 ));12231224 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));767 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1225 assert_eq!(TemplateModule::white_list(1)[0], 2);768 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1226 });769 });1227}770}12287711229#[test]772#[test]1230fn admin_can_add_address_to_white_list() {773fn admin_can_add_address_to_white_list() {1231 new_test_ext().execute_with(|| {774 new_test_ext().execute_with(|| {1232 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();775 default_limits();1233 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();776 1234 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();777 let collection_id = create_test_collection(&CollectionMode::NFT);1235 let mode: CollectionMode = CollectionMode::NFT(2000);1236 let origin1 = Origin::signed(1);778 let origin1 = Origin::signed(1);1237 let origin2 = Origin::signed(2);779 let origin2 = Origin::signed(2);12387801239 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 781 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1240 collection_numbers_limit: 10,1241 account_token_ownership_limit: 10,1242 collections_admins_limit: 5,1243 custom_data_limit: 2048,1244 nft_sponsor_transfer_timeout: 15,1245 fungible_sponsor_transfer_timeout: 15,1246 refungible_sponsor_transfer_timeout: 15, 1247 }));12481249 assert_ok!(TemplateModule::create_collection(1250 origin1.clone(),1251 col_name1.clone(),1252 col_desc1.clone(),1253 token_prefix1.clone(),1254 mode1255 ));12561257 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1258 assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), 1, 3));782 assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3));1259 assert_eq!(TemplateModule::white_list(1)[0], 3);783 assert_eq!(TemplateModule::white_list(collection_id)[0], 3);1260 });784 });1261}785}12627861263#[test]787#[test]1264fn nonprivileged_user_cannot_add_address_to_white_list() {788fn nonprivileged_user_cannot_add_address_to_white_list() {1265 new_test_ext().execute_with(|| {789 new_test_ext().execute_with(|| {1266 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();790 default_limits();1267 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();791 1268 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();792 let collection_id = create_test_collection(&CollectionMode::NFT);1269 let mode: CollectionMode = CollectionMode::NFT(2000);1270 let origin1 = Origin::signed(1);1271 let origin2 = Origin::signed(2);12727931273 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 794 let origin2 = Origin::signed(2);1274 collection_numbers_limit: 10,1275 account_token_ownership_limit: 10,1276 collections_admins_limit: 5,1277 custom_data_limit: 2048,1278 nft_sponsor_transfer_timeout: 15,1279 fungible_sponsor_transfer_timeout: 15,1280 refungible_sponsor_transfer_timeout: 15, 1281 }));12821283 assert_ok!(TemplateModule::create_collection(1284 origin1.clone(),1285 col_name1.clone(),1286 col_desc1.clone(),1287 token_prefix1.clone(),1288 mode1289 ));12901291 assert_noop!(795 assert_noop!(1292 TemplateModule::add_to_white_list(origin2.clone(), 1, 3),796 TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3),1293 "You do not have permissions to modify this collection"797 "You do not have permissions to modify this collection"1294 );798 );1295 });799 });1298#[test]802#[test]1299fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {803fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {1300 new_test_ext().execute_with(|| {804 new_test_ext().execute_with(|| {805 default_limits();8061301 let origin1 = Origin::signed(1);807 let origin1 = Origin::signed(1);13028081303 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1304 collection_numbers_limit: 10,1305 account_token_ownership_limit: 10,1306 collections_admins_limit: 5,1307 custom_data_limit: 2048,1308 nft_sponsor_transfer_timeout: 15,1309 fungible_sponsor_transfer_timeout: 15,1310 refungible_sponsor_transfer_timeout: 15, 1311 }));13121313 assert_noop!(809 assert_noop!(1314 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),810 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),1315 "This collection does not exist"811 "This collection does not exist"1320#[test]816#[test]1321fn nobody_can_add_address_to_white_list_of_deleted_collection() {817fn nobody_can_add_address_to_white_list_of_deleted_collection() {1322 new_test_ext().execute_with(|| {818 new_test_ext().execute_with(|| {1323 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();819 default_limits();1324 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();820 1325 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();821 let collection_id = create_test_collection(&CollectionMode::NFT);1326 let mode: CollectionMode = CollectionMode::NFT(2000);1327 let origin1 = Origin::signed(1);13288221329 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 823 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1330 collection_numbers_limit: 10,1331 account_token_ownership_limit: 10,1332 collections_admins_limit: 5,1333 custom_data_limit: 2048,1334 nft_sponsor_transfer_timeout: 15,1335 fungible_sponsor_transfer_timeout: 15,1336 refungible_sponsor_transfer_timeout: 15, 1337 }));13381339 assert_ok!(TemplateModule::create_collection(1340 origin1.clone(),1341 col_name1.clone(),1342 col_desc1.clone(),1343 token_prefix1.clone(),1344 mode1345 ));13461347 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));1348 assert_noop!(824 assert_noop!(1349 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),825 TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2),1350 "This collection does not exist"826 "This collection does not exist"1351 );827 );1352 });828 });1356#[test]832#[test]1357fn address_is_already_added_to_white_list() {833fn address_is_already_added_to_white_list() {1358 new_test_ext().execute_with(|| {834 new_test_ext().execute_with(|| {1359 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();835 default_limits();1360 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();836 1361 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();837 let collection_id = create_test_collection(&CollectionMode::NFT);1362 let mode: CollectionMode = CollectionMode::NFT(2000);1363 let origin1 = Origin::signed(1);838 let origin1 = Origin::signed(1);13641365 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 839 1366 collection_numbers_limit: 10,840 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1367 account_token_ownership_limit: 10,1368 collections_admins_limit: 5,1369 custom_data_limit: 2048,1370 nft_sponsor_transfer_timeout: 15,1371 fungible_sponsor_transfer_timeout: 15,1372 refungible_sponsor_transfer_timeout: 15, 1373 }));13741375 assert_ok!(TemplateModule::create_collection(1376 origin1.clone(),1377 col_name1.clone(),1378 col_desc1.clone(),1379 token_prefix1.clone(),1380 mode1381 ));13821383 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1384 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));841 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1385 assert_eq!(TemplateModule::white_list(1)[0], 2);842 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1386 assert_eq!(TemplateModule::white_list(1).len(), 1);843 assert_eq!(TemplateModule::white_list(collection_id).len(), 1);1387 });844 });1388}845}13898461390#[test]847#[test]1391fn owner_can_remove_address_from_white_list() {848fn owner_can_remove_address_from_white_list() {1392 new_test_ext().execute_with(|| {849 new_test_ext().execute_with(|| {1393 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();850 default_limits();1394 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();851 1395 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();852 let collection_id = create_test_collection(&CollectionMode::NFT);1396 let mode: CollectionMode = CollectionMode::NFT(2000);1397 let origin1 = Origin::signed(1);13988531399 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 854 let origin1 = Origin::signed(1);1400 collection_numbers_limit: 10,1401 account_token_ownership_limit: 10,1402 collections_admins_limit: 5,1403 custom_data_limit: 2048,1404 nft_sponsor_transfer_timeout: 15,1405 fungible_sponsor_transfer_timeout: 15,1406 refungible_sponsor_transfer_timeout: 15, 1407 }));14081409 assert_ok!(TemplateModule::create_collection(1410 origin1.clone(),1411 col_name1.clone(),1412 col_desc1.clone(),1413 token_prefix1.clone(),1414 mode1415 ));14161417 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));855 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1418 assert_ok!(TemplateModule::remove_from_white_list(856 assert_ok!(TemplateModule::remove_from_white_list(1419 origin1.clone(),857 origin1.clone(),1420 1,858 collection_id,1421 2859 21422 ));860 ));1423 assert_eq!(TemplateModule::white_list(1).len(), 0);861 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1424 });862 });1425}863}14268641427#[test]865#[test]1428fn admin_can_remove_address_from_white_list() {866fn admin_can_remove_address_from_white_list() {1429 new_test_ext().execute_with(|| {867 new_test_ext().execute_with(|| {1430 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();868 default_limits();1431 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();869 1432 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();870 let collection_id = create_test_collection(&CollectionMode::NFT);1433 let mode: CollectionMode = CollectionMode::NFT(2000);1434 let origin1 = Origin::signed(1);871 let origin1 = Origin::signed(1);1435 let origin2 = Origin::signed(2);872 let origin2 = Origin::signed(2);14368731437 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 874 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1438 collection_numbers_limit: 10,1439 account_token_ownership_limit: 10,1440 collections_admins_limit: 5,1441 custom_data_limit: 2048,1442 nft_sponsor_transfer_timeout: 15,1443 fungible_sponsor_transfer_timeout: 15,1444 refungible_sponsor_transfer_timeout: 15, 1445 }));14468751447 assert_ok!(TemplateModule::create_collection(876 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 3));1448 origin1.clone(),1449 col_name1.clone(),1450 col_desc1.clone(),1451 token_prefix1.clone(),1452 mode1453 ));14541455 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));14561457 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));1458 assert_ok!(TemplateModule::remove_from_white_list(877 assert_ok!(TemplateModule::remove_from_white_list(1459 origin2.clone(),878 origin2.clone(),1460 1,879 collection_id,1461 3880 31462 ));881 ));1463 assert_eq!(TemplateModule::white_list(1).len(), 0);882 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1464 });883 });1465}884}14668851467#[test]886#[test]1468fn nonprivileged_user_cannot_remove_address_from_white_list() {887fn nonprivileged_user_cannot_remove_address_from_white_list() {1469 new_test_ext().execute_with(|| {888 new_test_ext().execute_with(|| {1470 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();889 default_limits();1471 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();890 1472 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();891 let collection_id = create_test_collection(&CollectionMode::NFT);1473 let mode: CollectionMode = CollectionMode::NFT(2000);1474 let origin1 = Origin::signed(1);892 let origin1 = Origin::signed(1);1475 let origin2 = Origin::signed(2);893 let origin2 = Origin::signed(2);14768941477 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 895 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1478 collection_numbers_limit: 10,1479 account_token_ownership_limit: 10,1480 collections_admins_limit: 5,1481 custom_data_limit: 2048,1482 nft_sponsor_transfer_timeout: 15,1483 fungible_sponsor_transfer_timeout: 15,1484 refungible_sponsor_transfer_timeout: 15, 1485 }));14861487 assert_ok!(TemplateModule::create_collection(1488 origin1.clone(),1489 col_name1.clone(),1490 col_desc1.clone(),1491 token_prefix1.clone(),1492 mode1493 ));14941495 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1496 assert_noop!(896 assert_noop!(1497 TemplateModule::remove_from_white_list(origin2.clone(), 1, 2),897 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1498 "You do not have permissions to modify this collection"898 "You do not have permissions to modify this collection"1499 );899 );1500 assert_eq!(TemplateModule::white_list(1)[0], 2);900 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1501 });901 });1502}902}15039031504#[test]904#[test]1505fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {905fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1506 new_test_ext().execute_with(|| {906 new_test_ext().execute_with(|| {907 default_limits();1507 let origin1 = Origin::signed(1);908 let origin1 = Origin::signed(1);15089091509 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1510 collection_numbers_limit: 10,1511 account_token_ownership_limit: 10,1512 collections_admins_limit: 5,1513 custom_data_limit: 2048,1514 nft_sponsor_transfer_timeout: 15,1515 fungible_sponsor_transfer_timeout: 15,1516 refungible_sponsor_transfer_timeout: 15, 1517 }));15181519 assert_noop!(910 assert_noop!(1520 TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),911 TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),1521 "This collection does not exist"912 "This collection does not exist"1526#[test]917#[test]1527fn nobody_can_remove_address_from_white_list_of_deleted_collection() {918fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1528 new_test_ext().execute_with(|| {919 new_test_ext().execute_with(|| {1529 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();920 default_limits();1530 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();921 1531 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();922 let collection_id = create_test_collection(&CollectionMode::NFT);1532 let mode: CollectionMode = CollectionMode::NFT(2000);1533 let origin1 = Origin::signed(1);923 let origin1 = Origin::signed(1);1534 let origin2 = Origin::signed(2);924 let origin2 = Origin::signed(2);15359251536 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 926 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1537 collection_numbers_limit: 10,1538 account_token_ownership_limit: 10,1539 collections_admins_limit: 5,1540 custom_data_limit: 2048,1541 nft_sponsor_transfer_timeout: 15,1542 fungible_sponsor_transfer_timeout: 15,1543 refungible_sponsor_transfer_timeout: 15, 1544 }));15451546 assert_ok!(TemplateModule::create_collection(1547 origin1.clone(),1548 col_name1.clone(),1549 col_desc1.clone(),1550 token_prefix1.clone(),1551 mode1552 ));15531554 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1555 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));927 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1556 assert_noop!(928 assert_noop!(1557 TemplateModule::remove_from_white_list(origin2.clone(), 1, 2),929 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1558 "This collection does not exist"930 "This collection does not exist"1559 );931 );1560 assert_eq!(TemplateModule::white_list(1).len(), 0);932 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1561 });933 });1562}934}15639351564// If address is already removed from white list, nothing happens936// If address is already removed from white list, nothing happens1565#[test]937#[test]1566fn address_is_already_removed_from_white_list() {938fn address_is_already_removed_from_white_list() {1567 new_test_ext().execute_with(|| {939 new_test_ext().execute_with(|| {1568 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();940 default_limits();1569 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();941 1570 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();942 let collection_id = create_test_collection(&CollectionMode::NFT);1571 let mode: CollectionMode = CollectionMode::NFT(2000);1572 let origin1 = Origin::signed(1);943 let origin1 = Origin::signed(1);15739441574 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 945 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1575 collection_numbers_limit: 10,1576 account_token_ownership_limit: 10,1577 collections_admins_limit: 5,1578 custom_data_limit: 2048,1579 nft_sponsor_transfer_timeout: 15,1580 fungible_sponsor_transfer_timeout: 15,1581 refungible_sponsor_transfer_timeout: 15, 1582 }));15831584 assert_ok!(TemplateModule::create_collection(1585 origin1.clone(),1586 col_name1.clone(),1587 col_desc1.clone(),1588 token_prefix1.clone(),1589 mode1590 ));15911592 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1593 assert_ok!(TemplateModule::remove_from_white_list(946 assert_ok!(TemplateModule::remove_from_white_list(1594 origin1.clone(),947 origin1.clone(),1595 1,948 collection_id,1596 2949 21597 ));950 ));1598 assert_ok!(TemplateModule::remove_from_white_list(951 assert_ok!(TemplateModule::remove_from_white_list(1599 origin1.clone(),952 origin1.clone(),1600 1,953 collection_id,1601 2954 21602 ));955 ));1603 assert_eq!(TemplateModule::white_list(1).len(), 0);956 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1604 });957 });1605}958}16069591607// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)960// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1608#[test]961#[test]1609fn white_list_test_1() {962fn white_list_test_1() {1610 new_test_ext().execute_with(|| {963 new_test_ext().execute_with(|| {1611 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();964 default_limits();1612 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();965 1613 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();966 let collection_id = create_test_collection(&CollectionMode::NFT);1614 let mode: CollectionMode = CollectionMode::NFT(2000);16159671616 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1617 collection_numbers_limit: 10,1618 account_token_ownership_limit: 10,1619 collections_admins_limit: 5,1620 custom_data_limit: 2048,1621 nft_sponsor_transfer_timeout: 15,1622 fungible_sponsor_transfer_timeout: 15,1623 refungible_sponsor_transfer_timeout: 15, 1624 }));16251626 let origin1 = Origin::signed(1);968 let origin1 = Origin::signed(1);1627 assert_ok!(TemplateModule::create_collection(969 1628 origin1.clone(),970 let data = default_nft_data();1629 col_name1.clone(),1630 col_desc1.clone(),1631 token_prefix1.clone(),1632 mode1633 ));1634 assert_eq!(TemplateModule::collection(1).owner, 1);971 create_test_item(collection_id, &data);16359721636 assert_ok!(TemplateModule::create_item(1637 origin1.clone(),1638 1,1639 [1, 2, 3].to_vec(),1640 11641 ));16421643 assert_ok!(TemplateModule::set_public_access_mode(973 assert_ok!(TemplateModule::set_public_access_mode(1644 origin1.clone(),974 origin1.clone(),1645 1,975 collection_id,1646 AccessMode::WhiteList976 AccessMode::WhiteList1647 ));977 ));1648 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));978 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));16499791650 assert_noop!(980 assert_noop!(1651 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),981 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1657#[test]987#[test]1658fn white_list_test_2() {988fn white_list_test_2() {1659 new_test_ext().execute_with(|| {989 new_test_ext().execute_with(|| {1660 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();990 default_limits();1661 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();991 1662 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();992 let collection_id = create_test_collection(&CollectionMode::NFT);1663 let mode: CollectionMode = CollectionMode::NFT(2000);16641665 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1666 collection_numbers_limit: 10,1667 account_token_ownership_limit: 10,1668 collections_admins_limit: 5,1669 custom_data_limit: 2048,1670 nft_sponsor_transfer_timeout: 15,1671 fungible_sponsor_transfer_timeout: 15,1672 refungible_sponsor_transfer_timeout: 15, 1673 }));16741675 let origin1 = Origin::signed(1);993 let origin1 = Origin::signed(1);1676 assert_ok!(TemplateModule::create_collection(994 1677 origin1.clone(),995 let data = default_nft_data();1678 col_name1.clone(),1679 col_desc1.clone(),1680 token_prefix1.clone(),1681 mode1682 ));1683 assert_eq!(TemplateModule::collection(1).owner, 1);996 create_test_item(collection_id, &data);16849971685 assert_ok!(TemplateModule::create_item(1686 origin1.clone(),1687 1,1688 [1, 2, 3].to_vec(),1689 11690 ));16911692 assert_ok!(TemplateModule::set_public_access_mode(998 assert_ok!(TemplateModule::set_public_access_mode(1693 origin1.clone(),999 origin1.clone(),1694 1,1000 collection_id,1695 AccessMode::WhiteList1001 AccessMode::WhiteList1696 ));1002 ));1697 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1003 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1718#[test]1024#[test]1719fn white_list_test_3() {1025fn white_list_test_3() {1720 new_test_ext().execute_with(|| {1026 new_test_ext().execute_with(|| {1721 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1027 default_limits();1722 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1028 1723 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1029 let collection_id = create_test_collection(&CollectionMode::NFT);1724 let mode: CollectionMode = CollectionMode::NFT(2000);172510301726 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1727 collection_numbers_limit: 10,1728 account_token_ownership_limit: 10,1729 collections_admins_limit: 5,1730 custom_data_limit: 2048,1731 nft_sponsor_transfer_timeout: 15,1732 fungible_sponsor_transfer_timeout: 15,1733 refungible_sponsor_transfer_timeout: 15, 1734 }));17351736 let origin1 = Origin::signed(1);1031 let origin1 = Origin::signed(1);1737 assert_ok!(TemplateModule::create_collection(1032 1738 origin1.clone(),1033 let data = default_nft_data();1739 col_name1.clone(),1740 col_desc1.clone(),1741 token_prefix1.clone(),1742 mode1743 ));1744 assert_eq!(TemplateModule::collection(1).owner, 1);1034 create_test_item(collection_id, &data);174510351746 assert_ok!(TemplateModule::create_item(1747 origin1.clone(),1748 1,1749 [1, 2, 3].to_vec(),1750 11751 ));17521753 assert_ok!(TemplateModule::set_public_access_mode(1036 assert_ok!(TemplateModule::set_public_access_mode(1754 origin1.clone(),1037 origin1.clone(),1755 1,1038 collection_id,1756 AccessMode::WhiteList1039 AccessMode::WhiteList1757 ));1040 ));1758 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1041 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1767#[test]1050#[test]1768fn white_list_test_4() {1051fn white_list_test_4() {1769 new_test_ext().execute_with(|| {1052 new_test_ext().execute_with(|| {1770 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1053 default_limits();1771 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1054 1772 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1055 let collection_id = create_test_collection(&CollectionMode::NFT);1773 let mode: CollectionMode = CollectionMode::NFT(2000);177410561775 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1776 collection_numbers_limit: 10,1777 account_token_ownership_limit: 10,1778 collections_admins_limit: 5,1779 custom_data_limit: 2048,1780 nft_sponsor_transfer_timeout: 15,1781 fungible_sponsor_transfer_timeout: 15,1782 refungible_sponsor_transfer_timeout: 15, 1783 }));17841785 let origin1 = Origin::signed(1);1057 let origin1 = Origin::signed(1);1786 assert_ok!(TemplateModule::create_collection(1787 origin1.clone(),1788 col_name1.clone(),1789 col_desc1.clone(),1790 token_prefix1.clone(),1791 mode1792 ));1793 assert_eq!(TemplateModule::collection(1).owner, 1);179410581795 assert_ok!(TemplateModule::create_item(1059 let data = default_nft_data();1796 origin1.clone(),1797 1,1060 create_test_item(collection_id, &data);1798 [1, 2, 3].to_vec(),1799 11800 ));180110611802 assert_ok!(TemplateModule::set_public_access_mode(1062 assert_ok!(TemplateModule::set_public_access_mode(1803 origin1.clone(),1063 origin1.clone(),1804 1,1064 collection_id,1805 AccessMode::WhiteList1065 AccessMode::WhiteList1806 ));1066 ));1807 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1067 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1808 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1068 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));180910691810 // do approve1070 // do approve1811 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1071 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1812 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);1072 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);181310731814 assert_ok!(TemplateModule::remove_from_white_list(1074 assert_ok!(TemplateModule::remove_from_white_list(1815 origin1.clone(),1075 origin1.clone(),1816 1,1076 collection_id,1817 21077 21818 ));1078 ));181910791828#[test]1088#[test]1829fn white_list_test_5() {1089fn white_list_test_5() {1830 new_test_ext().execute_with(|| {1090 new_test_ext().execute_with(|| {1831 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1091 default_limits();1832 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1092 1833 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1093 let collection_id = create_test_collection(&CollectionMode::NFT);1834 let mode: CollectionMode = CollectionMode::NFT(2000);183510941836 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1837 collection_numbers_limit: 10,1838 account_token_ownership_limit: 10,1839 collections_admins_limit: 5,1840 custom_data_limit: 2048,1841 nft_sponsor_transfer_timeout: 15,1842 fungible_sponsor_transfer_timeout: 15,1843 refungible_sponsor_transfer_timeout: 15, 1844 }));18451846 let origin1 = Origin::signed(1);1095 let origin1 = Origin::signed(1);1847 assert_ok!(TemplateModule::create_collection(1848 origin1.clone(),1849 col_name1.clone(),1850 col_desc1.clone(),1851 token_prefix1.clone(),1852 mode1853 ));1854 assert_eq!(TemplateModule::collection(1).owner, 1);185510961856 assert_ok!(TemplateModule::create_item(1097 let data = default_nft_data();1857 origin1.clone(),1858 1,1098 create_test_item(collection_id, &data);1859 [1, 2, 3].to_vec(),1860 11861 ));186210991863 assert_ok!(TemplateModule::set_public_access_mode(1100 assert_ok!(TemplateModule::set_public_access_mode(1864 origin1.clone(),1101 origin1.clone(),1865 1,1102 collection_id,1866 AccessMode::WhiteList1103 AccessMode::WhiteList1867 ));1104 ));1868 assert_noop!(1105 assert_noop!(1876#[test]1113#[test]1877fn white_list_test_6() {1114fn white_list_test_6() {1878 new_test_ext().execute_with(|| {1115 new_test_ext().execute_with(|| {1879 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1116 default_limits();1880 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1117 1881 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1118 let collection_id = create_test_collection(&CollectionMode::NFT);1882 let mode: CollectionMode = CollectionMode::NFT(2000);188311191884 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1885 collection_numbers_limit: 10,1886 account_token_ownership_limit: 10,1887 collections_admins_limit: 5,1888 custom_data_limit: 2048,1889 nft_sponsor_transfer_timeout: 15,1890 fungible_sponsor_transfer_timeout: 15,1891 refungible_sponsor_transfer_timeout: 15, 1892 }));18931894 let origin1 = Origin::signed(1);1120 let origin1 = Origin::signed(1);1895 assert_ok!(TemplateModule::create_collection(1896 origin1.clone(),1897 col_name1.clone(),1898 col_desc1.clone(),1899 token_prefix1.clone(),1900 mode1901 ));1902 assert_ok!(TemplateModule::set_public_access_mode(1121 assert_ok!(TemplateModule::set_public_access_mode(1903 origin1.clone(),1122 origin1.clone(),1904 1,1123 collection_id,1905 AccessMode::WhiteList1124 AccessMode::WhiteList1906 ));1125 ));190711261918#[test]1137#[test]1919fn white_list_test_7() {1138fn white_list_test_7() {1920 new_test_ext().execute_with(|| {1139 new_test_ext().execute_with(|| {1921 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1140 default_limits();1922 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1141 1923 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1142 let collection_id = create_test_collection(&CollectionMode::NFT);1924 let mode: CollectionMode = CollectionMode::NFT(2000);192511431926 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1144 let data = default_nft_data();1927 collection_numbers_limit: 10,1145 create_test_item(collection_id, &data);1928 account_token_ownership_limit: 10,1929 collections_admins_limit: 5,1146 1930 custom_data_limit: 2048,1931 nft_sponsor_transfer_timeout: 15,1932 fungible_sponsor_transfer_timeout: 15,1933 refungible_sponsor_transfer_timeout: 15, 1934 }));19351936 let origin1 = Origin::signed(1);1147 let origin1 = Origin::signed(1);1937 assert_ok!(TemplateModule::create_collection(1938 origin1.clone(),1939 col_name1.clone(),1940 col_desc1.clone(),1941 token_prefix1.clone(),1942 mode1943 ));1944 assert_eq!(TemplateModule::collection(1).owner, 1);194511481946 assert_ok!(TemplateModule::create_item(1947 origin1.clone(),1948 1,1949 [1, 2, 3].to_vec(),1950 11951 ));19521953 assert_ok!(TemplateModule::set_public_access_mode(1149 assert_ok!(TemplateModule::set_public_access_mode(1954 origin1.clone(),1150 origin1.clone(),1955 1,1151 collection_id,1956 AccessMode::WhiteList1152 AccessMode::WhiteList1957 ));1153 ));1958 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1154 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1959 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1155 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));196011561961 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1157 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1962 });1158 });1965#[test]1161#[test]1966fn white_list_test_8() {1162fn white_list_test_8() {1967 new_test_ext().execute_with(|| {1163 new_test_ext().execute_with(|| {1968 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1164 default_limits();1969 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1165 1970 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1166 let collection_id = create_test_collection(&CollectionMode::NFT);1971 let mode: CollectionMode = CollectionMode::NFT(2000);197211671973 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1168 let data = default_nft_data();1974 collection_numbers_limit: 10,1169 create_test_item(collection_id, &data);1975 account_token_ownership_limit: 10,1976 collections_admins_limit: 5,1170 1977 custom_data_limit: 2048,1978 nft_sponsor_transfer_timeout: 15,1979 fungible_sponsor_transfer_timeout: 15,1980 refungible_sponsor_transfer_timeout: 15, 1981 }));19821983 let origin1 = Origin::signed(1);1171 let origin1 = Origin::signed(1);1984 assert_ok!(TemplateModule::create_collection(1985 origin1.clone(),1986 col_name1.clone(),1987 col_desc1.clone(),1988 token_prefix1.clone(),1989 mode1990 ));1991 assert_eq!(TemplateModule::collection(1).owner, 1);199211721993 assert_ok!(TemplateModule::create_item(1994 origin1.clone(),1995 1,1996 [1, 2, 3].to_vec(),1997 11998 ));19992000 assert_ok!(TemplateModule::set_public_access_mode(1173 assert_ok!(TemplateModule::set_public_access_mode(2001 origin1.clone(),1174 origin1.clone(),2002 1,1175 collection_id,2003 AccessMode::WhiteList1176 AccessMode::WhiteList2004 ));1177 ));2005 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1178 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));2006 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1179 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));200711802008 // do approve1181 // do approve2009 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1182 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));2024#[test]1197#[test]2025fn white_list_test_9() {1198fn white_list_test_9() {2026 new_test_ext().execute_with(|| {1199 new_test_ext().execute_with(|| {2027 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1200 default_limits();2028 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1201 2029 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1202 let collection_id = create_test_collection(&CollectionMode::NFT);2030 let mode: CollectionMode = CollectionMode::NFT(2000);20312032 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2033 collection_numbers_limit: 10,2034 account_token_ownership_limit: 10,2035 collections_admins_limit: 5,2036 custom_data_limit: 2048,2037 nft_sponsor_transfer_timeout: 15,2038 fungible_sponsor_transfer_timeout: 15,2039 refungible_sponsor_transfer_timeout: 15, 2040 }));20412042 let origin1 = Origin::signed(1);1203 let origin1 = Origin::signed(1);2043 assert_ok!(TemplateModule::create_collection(2044 origin1.clone(),2045 col_name1.clone(),2046 col_desc1.clone(),2047 token_prefix1.clone(),2048 mode2049 ));205012042051 assert_ok!(TemplateModule::set_public_access_mode(1205 assert_ok!(TemplateModule::set_public_access_mode(2052 origin1.clone(),1206 origin1.clone(),2053 1,1207 collection_id,2054 AccessMode::WhiteList1208 AccessMode::WhiteList2055 ));1209 ));2056 assert_ok!(TemplateModule::set_mint_permission(1210 assert_ok!(TemplateModule::set_mint_permission(2057 origin1.clone(),1211 origin1.clone(),2058 1,1212 collection_id,2059 false1213 false2060 ));1214 ));206112152062 assert_ok!(TemplateModule::create_item(1216 let data = default_nft_data();2063 origin1.clone(),2064 1,1217 create_test_item(collection_id, &data);2065 [1, 2, 3].to_vec(),2066 12067 ));2068 });1218 });2069}1219}207012202071// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1221// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.2072#[test]1222#[test]2073fn white_list_test_10() {1223fn white_list_test_10() {2074 new_test_ext().execute_with(|| {1224 new_test_ext().execute_with(|| {2075 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1225 default_limits();2076 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1226 2077 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1227 let collection_id = create_test_collection(&CollectionMode::NFT);2078 let mode: CollectionMode = CollectionMode::NFT(2000);207912282080 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2081 collection_numbers_limit: 10,2082 account_token_ownership_limit: 10,2083 collections_admins_limit: 5,2084 custom_data_limit: 2048,2085 nft_sponsor_transfer_timeout: 15,2086 fungible_sponsor_transfer_timeout: 15,2087 refungible_sponsor_transfer_timeout: 15, 2088 }));20892090 let origin1 = Origin::signed(1);1229 let origin1 = Origin::signed(1);2091 let origin2 = Origin::signed(2);1230 let origin2 = Origin::signed(2);2092 assert_ok!(TemplateModule::create_collection(2093 origin1.clone(),2094 col_name1.clone(),2095 col_desc1.clone(),2096 token_prefix1.clone(),2097 mode2098 ));209912312100 assert_ok!(TemplateModule::set_public_access_mode(1232 assert_ok!(TemplateModule::set_public_access_mode(2101 origin1.clone(),1233 origin1.clone(),2102 1,1234 collection_id,2103 AccessMode::WhiteList1235 AccessMode::WhiteList2104 ));1236 ));2105 assert_ok!(TemplateModule::set_mint_permission(1237 assert_ok!(TemplateModule::set_mint_permission(2106 origin1.clone(),1238 origin1.clone(),2107 1,1239 collection_id,2108 false1240 false2109 ));1241 ));211012422111 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1243 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));211212442113 assert_ok!(TemplateModule::create_item(1245 assert_ok!(TemplateModule::create_item(2114 origin2.clone(),1246 origin2.clone(),2115 1,1247 collection_id,2116 [1, 2, 3].to_vec(),1248 2,2117 21249 default_nft_data()2118 ));1250 ));2119 });1251 });2120}1252}2123#[test]1255#[test]2124fn white_list_test_11() {1256fn white_list_test_11() {2125 new_test_ext().execute_with(|| {1257 new_test_ext().execute_with(|| {2126 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1258 default_limits();2127 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1259 2128 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1260 let collection_id = create_test_collection(&CollectionMode::NFT);2129 let mode: CollectionMode = CollectionMode::NFT(2000);213012612131 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2132 collection_numbers_limit: 10,2133 account_token_ownership_limit: 10,2134 collections_admins_limit: 5,2135 custom_data_limit: 2048,2136 nft_sponsor_transfer_timeout: 15,2137 fungible_sponsor_transfer_timeout: 15,2138 refungible_sponsor_transfer_timeout: 15, 2139 }));21402141 let origin1 = Origin::signed(1);1262 let origin1 = Origin::signed(1);2142 let origin2 = Origin::signed(2);1263 let origin2 = Origin::signed(2);2143 assert_ok!(TemplateModule::create_collection(2144 origin1.clone(),2145 col_name1.clone(),2146 col_desc1.clone(),2147 token_prefix1.clone(),2148 mode2149 ));215012642151 assert_ok!(TemplateModule::set_public_access_mode(1265 assert_ok!(TemplateModule::set_public_access_mode(2152 origin1.clone(),1266 origin1.clone(),2153 1,1267 collection_id,2154 AccessMode::WhiteList1268 AccessMode::WhiteList2155 ));1269 ));2156 assert_ok!(TemplateModule::set_mint_permission(1270 assert_ok!(TemplateModule::set_mint_permission(2157 origin1.clone(),1271 origin1.clone(),2158 1,1272 collection_id,2159 false1273 false2160 ));1274 ));2161 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1275 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));216212762163 assert_noop!(1277 assert_noop!(2164 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),1278 TemplateModule::create_item(origin2.clone(), 1, vec![1, 2, 3], 2),2165 "Public minting is not allowed for this collection"1279 "Public minting is not allowed for this collection"2166 );1280 );2167 });1281 });2171#[test]1285#[test]2172fn white_list_test_12() {1286fn white_list_test_12() {2173 new_test_ext().execute_with(|| {1287 new_test_ext().execute_with(|| {2174 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1288 default_limits();2175 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1289 2176 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1290 let collection_id = create_test_collection(&CollectionMode::NFT);2177 let mode: CollectionMode = CollectionMode::NFT(2000);217812912179 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2180 collection_numbers_limit: 10,2181 account_token_ownership_limit: 10,2182 collections_admins_limit: 5,2183 custom_data_limit: 2048,2184 nft_sponsor_transfer_timeout: 15,2185 fungible_sponsor_transfer_timeout: 15,2186 refungible_sponsor_transfer_timeout: 15, 2187 }));21882189 let origin1 = Origin::signed(1);1292 let origin1 = Origin::signed(1);2190 let origin2 = Origin::signed(2);1293 let origin2 = Origin::signed(2);2191 assert_ok!(TemplateModule::create_collection(2192 origin1.clone(),2193 col_name1.clone(),2194 col_desc1.clone(),2195 token_prefix1.clone(),2196 mode2197 ));219812942199 assert_ok!(TemplateModule::set_public_access_mode(1295 assert_ok!(TemplateModule::set_public_access_mode(2200 origin1.clone(),1296 origin1.clone(),2201 1,1297 collection_id,2202 AccessMode::WhiteList1298 AccessMode::WhiteList2203 ));1299 ));2204 assert_ok!(TemplateModule::set_mint_permission(1300 assert_ok!(TemplateModule::set_mint_permission(2205 origin1.clone(),1301 origin1.clone(),2206 1,1302 collection_id,2207 false1303 false2208 ));1304 ));220913052210 assert_noop!(1306 assert_noop!(2211 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),1307 TemplateModule::create_item(origin2.clone(), 1, vec![1, 2, 3], 2),2212 "Public minting is not allowed for this collection"1308 "Public minting is not allowed for this collection"2213 );1309 );2214 });1310 });2218#[test]1314#[test]2219fn white_list_test_13() {1315fn white_list_test_13() {2220 new_test_ext().execute_with(|| {1316 new_test_ext().execute_with(|| {2221 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1317 default_limits();2222 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1318 2223 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1319 let collection_id = create_test_collection(&CollectionMode::NFT);2224 let mode: CollectionMode = CollectionMode::NFT(2000);222513202226 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2227 collection_numbers_limit: 10,2228 account_token_ownership_limit: 10,2229 collections_admins_limit: 5,2230 custom_data_limit: 2048,2231 nft_sponsor_transfer_timeout: 15,2232 fungible_sponsor_transfer_timeout: 15,2233 refungible_sponsor_transfer_timeout: 15, 2234 }));22352236 let origin1 = Origin::signed(1);1321 let origin1 = Origin::signed(1);2237 assert_ok!(TemplateModule::create_collection(2238 origin1.clone(),2239 col_name1.clone(),2240 col_desc1.clone(),2241 token_prefix1.clone(),2242 mode2243 ));224413222245 assert_ok!(TemplateModule::set_public_access_mode(1323 assert_ok!(TemplateModule::set_public_access_mode(2246 origin1.clone(),1324 origin1.clone(),2247 1,1325 collection_id,2248 AccessMode::WhiteList1326 AccessMode::WhiteList2249 ));1327 ));2250 assert_ok!(TemplateModule::set_mint_permission(1328 assert_ok!(TemplateModule::set_mint_permission(2251 origin1.clone(),1329 origin1.clone(),2252 1,1330 collection_id,2253 true1331 true2254 ));1332 ));225513332256 assert_ok!(TemplateModule::create_item(1334 let data = default_nft_data();2257 origin1.clone(),2258 1,1335 create_test_item(collection_id, &data);2259 [1, 2, 3].to_vec(),2260 12261 ));2262 });1336 });2263}1337}226413382265// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1339// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.2266#[test]1340#[test]2267fn white_list_test_14() {1341fn white_list_test_14() {2268 new_test_ext().execute_with(|| {1342 new_test_ext().execute_with(|| {2269 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1343 default_limits();2270 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1344 2271 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1345 let collection_id = create_test_collection(&CollectionMode::NFT);2272 let mode: CollectionMode = CollectionMode::NFT(2000);227313462274 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2275 collection_numbers_limit: 10,2276 account_token_ownership_limit: 10,2277 collections_admins_limit: 5,2278 custom_data_limit: 2048,2279 nft_sponsor_transfer_timeout: 15,2280 fungible_sponsor_transfer_timeout: 15,2281 refungible_sponsor_transfer_timeout: 15, 2282 }));22832284 let origin1 = Origin::signed(1);1347 let origin1 = Origin::signed(1);2285 let origin2 = Origin::signed(2);1348 let origin2 = Origin::signed(2);2286 assert_ok!(TemplateModule::create_collection(2287 origin1.clone(),2288 col_name1.clone(),2289 col_desc1.clone(),2290 token_prefix1.clone(),2291 mode2292 ));229313492294 assert_ok!(TemplateModule::set_public_access_mode(1350 assert_ok!(TemplateModule::set_public_access_mode(2295 origin1.clone(),1351 origin1.clone(),2296 1,1352 collection_id,2297 AccessMode::WhiteList1353 AccessMode::WhiteList2298 ));1354 ));2299 assert_ok!(TemplateModule::set_mint_permission(1355 assert_ok!(TemplateModule::set_mint_permission(2300 origin1.clone(),1356 origin1.clone(),2301 1,1357 collection_id,2302 true1358 true2303 ));1359 ));230413602305 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1361 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));230613622307 assert_ok!(TemplateModule::create_item(1363 assert_ok!(TemplateModule::create_item(2308 origin2.clone(),1364 origin2.clone(),2309 1,1365 1,2310 [1, 2, 3].to_vec(),1366 2,2311 21367 default_nft_data()2312 ));1368 ));2313 });1369 });2314}1370}2317#[test]1373#[test]2318fn white_list_test_15() {1374fn white_list_test_15() {2319 new_test_ext().execute_with(|| {1375 new_test_ext().execute_with(|| {2320 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1376 default_limits();2321 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1377 2322 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1378 let collection_id = create_test_collection(&CollectionMode::NFT);2323 let mode: CollectionMode = CollectionMode::NFT(2000);232413792325 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2326 collection_numbers_limit: 10,2327 account_token_ownership_limit: 10,2328 collections_admins_limit: 5,2329 custom_data_limit: 2048,2330 nft_sponsor_transfer_timeout: 15,2331 fungible_sponsor_transfer_timeout: 15,2332 refungible_sponsor_transfer_timeout: 15, 2333 }));23342335 let origin1 = Origin::signed(1);1380 let origin1 = Origin::signed(1);2336 let origin2 = Origin::signed(2);1381 let origin2 = Origin::signed(2);2337 assert_ok!(TemplateModule::create_collection(2338 origin1.clone(),2339 col_name1.clone(),2340 col_desc1.clone(),2341 token_prefix1.clone(),2342 mode2343 ));234413822345 assert_ok!(TemplateModule::set_public_access_mode(1383 assert_ok!(TemplateModule::set_public_access_mode(2346 origin1.clone(),1384 origin1.clone(),2347 1,1385 collection_id,2348 AccessMode::WhiteList1386 AccessMode::WhiteList2349 ));1387 ));2350 assert_ok!(TemplateModule::set_mint_permission(1388 assert_ok!(TemplateModule::set_mint_permission(2351 origin1.clone(),1389 origin1.clone(),2352 1,1390 collection_id,2353 true1391 true2354 ));1392 ));235513932356 assert_noop!(1394 assert_noop!(2357 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),1395 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data()),2358 "Address is not in white list"1396 "Address is not in white list"2359 );1397 );2360 });1398 });2364#[test]1402#[test]2365fn white_list_test_16() {1403fn white_list_test_16() {2366 new_test_ext().execute_with(|| {1404 new_test_ext().execute_with(|| {2367 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1405 default_limits();2368 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1406 2369 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1407 let collection_id = create_test_collection(&CollectionMode::NFT);2370 let mode: CollectionMode = CollectionMode::NFT(2000);237114082372 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2373 collection_numbers_limit: 10,2374 account_token_ownership_limit: 10,2375 collections_admins_limit: 5,2376 custom_data_limit: 2048,2377 nft_sponsor_transfer_timeout: 15,2378 fungible_sponsor_transfer_timeout: 15,2379 refungible_sponsor_transfer_timeout: 15, 2380 }));23812382 let origin1 = Origin::signed(1);1409 let origin1 = Origin::signed(1);2383 let origin2 = Origin::signed(2);1410 let origin2 = Origin::signed(2);2384 assert_ok!(TemplateModule::create_collection(2385 origin1.clone(),2386 col_name1.clone(),2387 col_desc1.clone(),2388 token_prefix1.clone(),2389 mode2390 ));239114112392 assert_ok!(TemplateModule::set_public_access_mode(1412 assert_ok!(TemplateModule::set_public_access_mode(2393 origin1.clone(),1413 origin1.clone(),2394 1,1414 collection_id,2395 AccessMode::WhiteList1415 AccessMode::WhiteList2396 ));1416 ));2397 assert_ok!(TemplateModule::set_mint_permission(1417 assert_ok!(TemplateModule::set_mint_permission(2398 origin1.clone(),1418 origin1.clone(),2399 1,1419 collection_id,2400 true1420 true2401 ));1421 ));2402 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1422 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));240314232404 assert_ok!(TemplateModule::create_item(1424 assert_ok!(TemplateModule::create_item(2405 origin2.clone(),1425 origin2.clone(),2406 1,1426 1,2407 [1, 2, 3].to_vec(),1427 2,2408 21428 default_nft_data()2409 ));1429 ));2410 });1430 });2411}1431}2414#[test]1434#[test]2415fn total_number_collections_bound() {1435fn total_number_collections_bound() {2416 new_test_ext().execute_with(|| {1436 new_test_ext().execute_with(|| {2417 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1437 default_limits();2418 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1438 2419 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1439 create_test_collection(&CollectionMode::NFT);2420 let mode: CollectionMode = CollectionMode::NFT(2000);24212422 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2423 collection_numbers_limit: 10,2424 account_token_ownership_limit: 10,2425 collections_admins_limit: 5,2426 custom_data_limit: 2048,2427 nft_sponsor_transfer_timeout: 15,2428 fungible_sponsor_transfer_timeout: 15,2429 refungible_sponsor_transfer_timeout: 15, 2430 }));24312432 let origin1 = Origin::signed(1);2433 assert_ok!(TemplateModule::create_collection(2434 origin1.clone(),2435 col_name1.clone(),2436 col_desc1.clone(),2437 token_prefix1.clone(),2438 mode2439 ));2440 });1440 });2441}1441}244214422443// Total number of collections. Negotive test1443// Total number of collections. Negotive test2444#[test]1444#[test]2445fn total_number_collections_bound_neg() {1445fn total_number_collections_bound_neg() {2446 new_test_ext().execute_with(|| {1446 new_test_ext().execute_with(|| {2447 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1447 default_limits();2448 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2449 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2450 let mode: CollectionMode = CollectionMode::NFT(2000);245114482452 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2453 collection_numbers_limit: 10,2454 account_token_ownership_limit: 10,2455 collections_admins_limit: 5,2456 custom_data_limit: 2048,2457 nft_sponsor_transfer_timeout: 15,2458 fungible_sponsor_transfer_timeout: 15,2459 refungible_sponsor_transfer_timeout: 15, 2460 }));24612462 let origin1 = Origin::signed(1);1449 let origin1 = Origin::signed(1);246314502464 for _ in 0..10 {1451 for _ in 0..default_collection_numbers_limit() {24652466 assert_ok!(TemplateModule::create_collection(1452 create_test_collection(&CollectionMode::NFT)2467 origin1.clone(),2468 col_name1.clone(),2469 col_desc1.clone(),2470 token_prefix1.clone(),2471 mode.clone()2472 ));2473 }1453 }247414542475 // 11-th collection in chain. Expects error1455 // 11-th collection in chain. Expects error2487#[test]1467#[test]2488fn owned_tokens_bound() {1468fn owned_tokens_bound() {2489 new_test_ext().execute_with(|| {1469 new_test_ext().execute_with(|| {2490 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1470 default_limits();2491 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1471 2492 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1472 let collection_id = create_test_collection(&CollectionMode::NFT);2493 let mode: CollectionMode = CollectionMode::NFT(2000);249414732495 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1474 let data = default_nft_data();2496 collection_numbers_limit: 10,2497 account_token_ownership_limit: 10,2498 collections_admins_limit: 5,2499 custom_data_limit: 2048,2500 nft_sponsor_transfer_timeout: 15,2501 fungible_sponsor_transfer_timeout: 15,2502 refungible_sponsor_transfer_timeout: 15, 2503 }));25042505 let origin1 = Origin::signed(1);2506 assert_ok!(TemplateModule::create_collection(1475 create_test_item(collection_id, &data);2507 origin1.clone(),2508 col_name1.clone(),2509 col_desc1.clone(),2510 token_prefix1.clone(),2511 mode2512 ));25132514 assert_ok!(TemplateModule::create_item(1476 create_test_item(collection_id, &data);2515 origin1.clone(),2516 1,2517 [1, 2, 3].to_vec(),2518 12519 ));25202521 assert_ok!(TemplateModule::create_item(2522 origin1.clone(),2523 1,2524 [1, 2, 3].to_vec(),2525 12526 ));2527 });1477 });2528}1478}252914792530// Owned tokens by a single address. Negotive test1480// Owned tokens by a single address. Negotive test2531#[test]1481#[test]2532fn owned_tokens_bound_neg() {1482fn owned_tokens_bound_neg() {2533 new_test_ext().execute_with(|| {1483 new_test_ext().execute_with(|| {2534 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2535 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2536 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2537 let mode: CollectionMode = CollectionMode::NFT(2000);25382539 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1484 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2540 collection_numbers_limit: 10,1485 collection_numbers_limit: 10,2541 account_token_ownership_limit: 1,1486 account_token_ownership_limit: 1,2545 fungible_sponsor_transfer_timeout: 15,1490 fungible_sponsor_transfer_timeout: 15,2546 refungible_sponsor_transfer_timeout: 15, 1491 refungible_sponsor_transfer_timeout: 15, 2547 }));1492 }));1493 1494 let collection_id = create_test_collection(&CollectionMode::NFT);254814952549 let origin1 = Origin::signed(1);1496 let origin1 = Origin::signed(1);2550 assert_ok!(TemplateModule::create_collection(1497 let data = default_nft_data();2551 origin1.clone(),2552 col_name1.clone(),1498 create_test_item(collection_id, &data);2553 col_desc1.clone(),2554 token_prefix1.clone(),2555 mode2556 ));255714992558 assert_ok!(TemplateModule::create_item(2559 origin1.clone(),2560 1,2561 [1, 2, 3].to_vec(),2562 12563 ));25642565 assert_noop!(TemplateModule::create_item(1500 assert_noop!(TemplateModule::create_item(2566 origin1.clone(),1501 origin1.clone(),2567 1,1502 1,2568 [1, 2, 3].to_vec(),1503 1,2569 11504 data2570 ), "Owned tokens by a single address bound exceeded");1505 ), "Owned tokens by a single address bound exceeded");2571 });1506 });2572}1507}2575#[test]1510#[test]2576fn collection_admins_bound() {1511fn collection_admins_bound() {2577 new_test_ext().execute_with(|| {1512 new_test_ext().execute_with(|| {2578 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2579 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2580 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2581 let mode: CollectionMode = CollectionMode::NFT(2000);25822583 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1513 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2584 collection_numbers_limit: 10,1514 collection_numbers_limit: 10,2585 account_token_ownership_limit: 10,1515 account_token_ownership_limit: 10,2589 fungible_sponsor_transfer_timeout: 15,1519 fungible_sponsor_transfer_timeout: 15,2590 refungible_sponsor_transfer_timeout: 15, 1520 refungible_sponsor_transfer_timeout: 15, 2591 }));1521 }));1522 1523 let collection_id = create_test_collection(&CollectionMode::NFT);259215242593 let origin1 = Origin::signed(1);1525 let origin1 = Origin::signed(1);2594 assert_ok!(TemplateModule::create_collection(1526 2595 origin1.clone(),2596 col_name1.clone(),2597 col_desc1.clone(),2598 token_prefix1.clone(),2599 mode2600 ));26012602 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1527 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));2603 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));1528 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3));2604 });1529 });2605}1530}260615312607// Number of collection admins. Negotive test1532// Number of collection admins. Negotive test2608#[test]1533#[test]2609fn collection_admins_bound_neg() {1534fn collection_admins_bound_neg() {2610 new_test_ext().execute_with(|| {1535 new_test_ext().execute_with(|| {2611 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2612 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2613 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2614 let mode: CollectionMode = CollectionMode::NFT(2000);26152616 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1536 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2617 collection_numbers_limit: 10,1537 collection_numbers_limit: 10,2618 account_token_ownership_limit: 1,1538 account_token_ownership_limit: 1,2622 fungible_sponsor_transfer_timeout: 15,1542 fungible_sponsor_transfer_timeout: 15,2623 refungible_sponsor_transfer_timeout: 15, 1543 refungible_sponsor_transfer_timeout: 15, 2624 }));1544 }));1545 1546 let collection_id = create_test_collection(&CollectionMode::NFT);262515472626 let origin1 = Origin::signed(1);1548 let origin1 = Origin::signed(1);2627 assert_ok!(TemplateModule::create_collection(2628 origin1.clone(),2629 col_name1.clone(),2630 col_desc1.clone(),2631 token_prefix1.clone(),2632 mode2633 ));263415492635 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1550 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));2636 assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3), "Number of collection admins bound exceeded");1551 assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3), "Number of collection admins bound exceeded");2637 });1552 });2638}1553}263915542640// Custom data size. Positive test1555// NFT custom data size. Negative test const_data.2641#[test]1556#[test]2642fn custom_data_size_bound() {1557fn custom_data_size_nft_const_data_bound_neg() {2643 new_test_ext().execute_with(|| {1558 new_test_ext().execute_with(|| {2644 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1559 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1560 collection_numbers_limit: 10,1561 account_token_ownership_limit: 10,1562 collections_admins_limit: 5,2645 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1563 custom_data_limit: 2,1564 nft_sponsor_transfer_timeout: 15,1565 fungible_sponsor_transfer_timeout: 15,2646 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1566 refungible_sponsor_transfer_timeout: 15, 1567 }));2647 let mode: CollectionMode = CollectionMode::NFT(2000);1568 1569 let collection_id = create_test_collection(&CollectionMode::NFT);264815701571 let origin1 = Origin::signed(1);1572 let too_big_const_data = CreateItemData::NFT(CreateNftData{1573 const_data: vec![1, 2, 3, 4],1574 variable_data: vec![]1575 });15761577 assert_noop!(TemplateModule::create_item(1578 origin1.clone(),1579 collection_id,1580 1,1581 too_big_const_data1582 ), "const_data exceeded data limit: 2.");1583 });1584}15851586// NFT custom data size. Negative test variable_data.1587#[test]1588fn custom_data_size_nft_variable_data_bound_neg() {1589 new_test_ext().execute_with(|| {2649 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1590 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2650 collection_numbers_limit: 10,1591 collection_numbers_limit: 10,2651 account_token_ownership_limit: 10,1592 account_token_ownership_limit: 10,2652 collections_admins_limit: 5,1593 collections_admins_limit: 5,2653 custom_data_limit: 2048,1594 custom_data_limit: 2,2654 nft_sponsor_transfer_timeout: 15,1595 nft_sponsor_transfer_timeout: 15,2655 fungible_sponsor_transfer_timeout: 15,1596 fungible_sponsor_transfer_timeout: 15,2656 refungible_sponsor_transfer_timeout: 15, 1597 refungible_sponsor_transfer_timeout: 15, 2657 }));1598 }));265815991600 let collection_id = create_test_collection(&CollectionMode::NFT);16012659 let origin1 = Origin::signed(1);1602 let origin1 = Origin::signed(1);2660 assert_ok!(TemplateModule::create_collection(1603 let too_big_const_data = CreateItemData::NFT(CreateNftData{1604 const_data: vec![],1605 variable_data: vec![1, 2, 3, 4]1606 });16071608 assert_noop!(TemplateModule::create_item(2661 origin1.clone(),1609 origin1.clone(),2662 col_name1.clone(),1610 collection_id,2663 col_desc1.clone(),1611 1,2664 token_prefix1.clone(),1612 too_big_const_data2665 mode1613 ), "variable_data exceeded data limit: 2.");2666 ));2667 });1614 });2668}1615}266916162670// Custom data size. Negotive test1617// Re fungible custom data size. Negative test const_data.2671#[test]1618#[test]2672fn custom_data_size_bound_neg() {1619fn custom_data_size_re_fungible_const_data_bound_neg() {2673 new_test_ext().execute_with(|| {1620 new_test_ext().execute_with(|| {2674 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1621 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2675 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1622 collection_numbers_limit: 10,1623 account_token_ownership_limit: 10,1624 collections_admins_limit: 5,2676 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1625 custom_data_limit: 2,1626 nft_sponsor_transfer_timeout: 15,2677 let mode: CollectionMode = CollectionMode::NFT(2000);1627 fungible_sponsor_transfer_timeout: 15,1628 refungible_sponsor_transfer_timeout: 15, 1629 }));267816301631 let collection_id = create_test_collection(&CollectionMode::NFT);16321633 let origin1 = Origin::signed(1);1634 let too_big_const_data = CreateItemData::NFT(CreateNftData{1635 const_data: vec![1, 2, 3, 4],1636 variable_data: vec![]1637 });16381639 assert_noop!(TemplateModule::create_item(1640 origin1.clone(),1641 collection_id,1642 1,1643 too_big_const_data1644 ), "const_data exceeded data limit: 2.");1645 });1646}16471648// Re fungible custom data size. Negative test variable_data.1649#[test]1650fn custom_data_size_re_fungible_variable_data_bound_neg() {1651 new_test_ext().execute_with(|| {2679 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1652 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2680 collection_numbers_limit: 10,1653 collection_numbers_limit: 10,2681 account_token_ownership_limit: 10,1654 account_token_ownership_limit: 10,2682 collections_admins_limit: 5,1655 collections_admins_limit: 5,2683 custom_data_limit: 200,1656 custom_data_limit: 2,2684 nft_sponsor_transfer_timeout: 15,1657 nft_sponsor_transfer_timeout: 15,2685 fungible_sponsor_transfer_timeout: 15,1658 fungible_sponsor_transfer_timeout: 15,2686 refungible_sponsor_transfer_timeout: 15, 1659 refungible_sponsor_transfer_timeout: 15, 2687 }));1660 }));268816611662 let collection_id = create_test_collection(&CollectionMode::NFT);16632689 let origin1 = Origin::signed(1);1664 let origin1 = Origin::signed(1);2690 assert_noop!(TemplateModule::create_collection(1665 let too_big_const_data = CreateItemData::NFT(CreateNftData{1666 const_data: vec![],1667 variable_data: vec![1, 2, 3, 4]1668 });16691670 assert_noop!(TemplateModule::create_item(2691 origin1.clone(),1671 origin1.clone(),2692 col_name1.clone(),1672 collection_id,2693 col_desc1.clone(),1673 1,2694 token_prefix1.clone(),1674 too_big_const_data2695 mode1675 ), "variable_data exceeded data limit: 2.");2696 ), "Custom data size bound exceeded");2697 });1676 });2698}1677}2699// #endregion1678// #endregion270016791680#[test]1681fn set_const_on_chain_schema() {1682 new_test_ext().execute_with(|| {1683 default_limits();16841685 let collection_id = create_test_collection(&CollectionMode::NFT);16861687 let origin1 = Origin::signed(1);1688 assert_ok!(TemplateModule::set_const_on_chain_schema(origin1, collection_id, "test const on chain schema".to_vec()));16891690 assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, "test const on chain schema".to_vec());1691 assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, "".to_vec());1692 });1693}16941695#[test]1696fn set_variable_on_chain_schema() {1697 new_test_ext().execute_with(|| {1698 default_limits();1699 1700 let collection_id = create_test_collection(&CollectionMode::NFT);17011702 let origin1 = Origin::signed(1);1703 assert_ok!(TemplateModule::set_variable_on_chain_schema(origin1, collection_id, "test variable on chain schema".to_vec()));17041705 assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, "".to_vec());1706 assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, "test variable on chain schema".to_vec());1707 });1708}runtime/src/nft_weights.rsdiffbeforeafterboth93 .saturating_add(DbWeight::get().reads(2 as Weight))93 .saturating_add(DbWeight::get().reads(2 as Weight))94 .saturating_add(DbWeight::get().writes(1 as Weight))94 .saturating_add(DbWeight::get().writes(1 as Weight))95 }95 }96 fn set_const_on_chain_schema() -> Weight {97 (11_100_000 as Weight)98 .saturating_add(DbWeight::get().reads(2 as Weight))99 .saturating_add(DbWeight::get().writes(1 as Weight))100 }101 fn set_variable_on_chain_schema() -> Weight {102 (11_100_000 as Weight)103 .saturating_add(DbWeight::get().reads(2 as Weight))104 .saturating_add(DbWeight::get().writes(1 as Weight))105 }106 fn set_variable_meta_data() -> Weight {107 (17_500_000 as Weight)108 .saturating_add(DbWeight::get().reads(2 as Weight))109 .saturating_add(DbWeight::get().writes(1 as Weight))110 }96}111}97112