difftreelog
Fix unit test building
in: master
8 files changed
Cargo.lockdiffbeforeafterboth--- a/Cargo.lock
+++ b/Cargo.lock
@@ -5097,6 +5097,7 @@
"frame-system-rpc-runtime-api",
"hex-literal",
"nft-data-structs",
+ "orml-vesting",
"pallet-aura",
"pallet-balances",
"pallet-common",
@@ -5120,7 +5121,6 @@
"pallet-transaction-payment-rpc-runtime-api",
"pallet-treasury",
"pallet-unq-scheduler",
- "pallet-vesting",
"pallet-xcm",
"parachain-info",
"parity-scale-codec",
@@ -5308,6 +5308,21 @@
]
[[package]]
+name = "orml-vesting"
+version = "0.4.1-dev"
+source = "git+https://github.com/UniqueNetwork/open-runtime-module-library#d69f226e332ae29b7b33d53d2f06f309d2986ea0"
+dependencies = [
+ "frame-support",
+ "frame-system",
+ "parity-scale-codec",
+ "scale-info",
+ "serde",
+ "sp-io",
+ "sp-runtime",
+ "sp-std",
+]
+
+[[package]]
name = "owning_ref"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
pallets/common/src/lib.rsdiffbeforeafterboth--- a/pallets/common/src/lib.rs
+++ b/pallets/common/src/lib.rs
@@ -273,8 +273,8 @@
TotalCollectionsLimitExceeded,
/// variable_data exceeded data limit.
TokenVariableDataLimitExceeded,
- /// Exceeded max admin amount
- CollectionAdminAmountExceeded,
+ /// Exceeded max admin count
+ CollectionAdminCountExceeded,
/// Collection settings not allowing items transferring
TransferNotAllowed,
@@ -479,10 +479,10 @@
if admin {
let amount = amount
.checked_add(1)
- .ok_or(<Error<T>>::CollectionAdminAmountExceeded)?;
+ .ok_or(<Error<T>>::CollectionAdminCountExceeded)?;
ensure!(
amount <= Self::collection_admins_limit(),
- <Error<T>>::CollectionAdminAmountExceeded,
+ <Error<T>>::CollectionAdminCountExceeded,
);
// =========
pallets/fungible/src/common.rsdiffbeforeafterboth--- a/pallets/fungible/src/common.rs
+++ b/pallets/fungible/src/common.rs
@@ -182,7 +182,7 @@
_token: TokenId,
_data: Vec<u8>,
) -> DispatchResultWithPostInfo {
- fail!(<Error<T>>::FungibleItemsHaveData)
+ fail!(<Error<T>>::FungibleItemsDontHaveData)
}
fn account_tokens(&self, account: T::CrossAccountId) -> Vec<TokenId> {
pallets/fungible/src/lib.rsdiffbeforeafterboth--- a/pallets/fungible/src/lib.rs
+++ b/pallets/fungible/src/lib.rs
@@ -35,7 +35,7 @@
/// Not default id passed as TokenId argument
FungibleItemsHaveNoId,
/// Tried to set data for fungible item
- FungibleItemsHaveData,
+ FungibleItemsDontHaveData,
}
#[pallet::config]
@@ -44,15 +44,15 @@
}
#[pallet::pallet]
- #[pallet::generate_store(pub(super) trait Store)]
+ #[pallet::generate_store(pub trait Store)]
pub struct Pallet<T>(_);
#[pallet::storage]
- pub(super) type TotalSupply<T: Config> =
+ pub type TotalSupply<T: Config> =
StorageMap<Hasher = Twox64Concat, Key = CollectionId, Value = u128, QueryKind = ValueQuery>;
#[pallet::storage]
- pub(super) type Balance<T: Config> = StorageNMap<
+ pub type Balance<T: Config> = StorageNMap<
Key = (
Key<Twox64Concat, CollectionId>,
Key<Blake2_128Concat, T::CrossAccountId>,
@@ -62,7 +62,7 @@
>;
#[pallet::storage]
- pub(super) type Allowance<T: Config> = StorageNMap<
+ pub type Allowance<T: Config> = StorageNMap<
Key = (
Key<Twox64Concat, CollectionId>,
Key<Blake2_128, T::CrossAccountId>,
pallets/nft/src/mock.rsdiffbeforeafterboth--- a/pallets/nft/src/mock.rs
+++ b/pallets/nft/src/mock.rs
@@ -124,25 +124,35 @@
#[derive(Encode, Decode, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, TypeInfo)]
pub struct TestCrossAccountId(u64, sp_core::H160);
impl CrossAccountId<u64> for TestCrossAccountId {
+ fn as_sub(&self) -> &u64 {
+ &self.0
+ }
+ fn as_eth(&self) -> &sp_core::H160 {
+ &self.1
+ }
fn from_sub(sub: u64) -> Self {
let mut eth = [0; 20];
eth[12..20].copy_from_slice(&sub.to_be_bytes());
Self(sub, sp_core::H160(eth))
}
- fn as_sub(&self) -> &u64 {
- &self.0
- }
fn from_eth(eth: sp_core::H160) -> Self {
let mut sub_raw = [0; 8];
sub_raw.copy_from_slice(ð.0[0..8]);
let sub = u64::from_be_bytes(sub_raw);
Self(sub, eth)
}
- fn as_eth(&self) -> &sp_core::H160 {
- &self.1
+ fn conv_eq(&self, other: &Self) -> bool {
+ self.as_sub() == other.as_sub()
+ }
+}
+
+impl Default for TestCrossAccountId {
+ fn default() -> Self {
+ Self::from_sub(0)
}
}
+
pub struct TestEtheremTransactionSender;
impl pallet_ethereum::EthereumTransactionSender for TestEtheremTransactionSender {
fn submit_logs_transaction(
@@ -157,6 +167,27 @@
type EthereumTransactionSender = TestEtheremTransactionSender;
}
+impl pallet_common::Config for Test {
+ type Event = ();
+ type EvmBackwardsAddressMapping = TestEvmBackwardsAddressMapping;
+ type EvmAddressMapping = TestEvmAddressMapping;
+ type CrossAccountId = TestCrossAccountId;
+
+ type Currency = Balances;
+ type CollectionCreationPrice = CollectionCreationPrice;
+ type TreasuryAccountId = TreasuryAccountId;
+}
+
+impl pallet_fungible::Config for Test {
+ type WeightInfo = ();
+}
+impl pallet_refungible::Config for Test {
+ type WeightInfo = ();
+}
+impl pallet_nonfungible::Config for Test {
+ type WeightInfo = ();
+}
+
impl pallet_template::Config for Test {
type WeightInfo = ();
}
pallets/nft/src/tests.rsdiffbeforeafterboth1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode, CreateItemData};5use nft_data_structs::{6 CreateNftData, CreateFungibleData, CreateReFungibleData, CollectionId, TokenId,7 MAX_DECIMAL_POINTS,8};9use frame_support::{assert_noop, assert_ok};10use sp_std::convert::TryInto;1112fn default_nft_data() -> CreateNftData {13 CreateNftData {14 const_data: vec![1, 2, 3].try_into().unwrap(),15 variable_data: vec![3, 2, 1].try_into().unwrap(),16 }17}1819fn default_fungible_data() -> CreateFungibleData {20 CreateFungibleData { value: 5 }21}2223fn default_re_fungible_data() -> CreateReFungibleData {24 CreateReFungibleData {25 const_data: vec![1, 2, 3].try_into().unwrap(),26 variable_data: vec![3, 2, 1].try_into().unwrap(),27 pieces: 1023,28 }29}3031fn create_test_collection_for_owner(32 mode: &CollectionMode,33 owner: u64,34 id: CollectionId,35) -> CollectionId {36 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();37 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();38 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();3940 let origin1 = Origin::signed(owner);41 assert_ok!(TemplateModule::create_collection(42 origin1,43 col_name1,44 col_desc1,45 token_prefix1,46 mode.clone()47 ));4849 let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();50 let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();51 let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();52 assert_eq!(TemplateModule::collection_id(id).unwrap().owner, owner);53 assert_eq!(54 TemplateModule::collection_id(id).unwrap().name,55 saved_col_name56 );57 assert_eq!(TemplateModule::collection_id(id).unwrap().mode, *mode);58 assert_eq!(59 TemplateModule::collection_id(id).unwrap().description,60 saved_description61 );62 assert_eq!(63 TemplateModule::collection_id(id).unwrap().token_prefix,64 saved_prefix65 );66 id67}6869fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {70 create_test_collection_for_owner(&mode, 1, id)71}7273fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {74 let origin1 = Origin::signed(1);75 assert_ok!(TemplateModule::create_item(76 origin1,77 collection_id,78 account(1),79 data.clone()80 ));81}8283fn account(sub: u64) -> TestCrossAccountId {84 TestCrossAccountId::from_sub(sub)85}8687// Use cases tests region88// #region8990#[test]91fn set_version_schema() {92 new_test_ext().execute_with(|| {93 let origin1 = Origin::signed(1);94 let collection_id = create_test_collection(&CollectionMode::NFT, 1);9596 assert_ok!(TemplateModule::set_schema_version(97 origin1,98 collection_id,99 SchemaVersion::Unique100 ));101 assert_eq!(102 TemplateModule::collection_id(collection_id)103 .unwrap()104 .schema_version,105 SchemaVersion::Unique106 );107 });108}109110#[test]111fn create_fungible_collection_fails_with_large_decimal_numbers() {112 new_test_ext().execute_with(|| {113 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();114 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();115 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();116117 let origin1 = Origin::signed(1);118 assert_noop!(119 TemplateModule::create_collection(120 origin1,121 col_name1,122 col_desc1,123 token_prefix1,124 CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)125 ),126 Error::<Test>::CollectionDecimalPointLimitExceeded127 );128 });129}130131#[test]132fn create_nft_item() {133 new_test_ext().execute_with(|| {134 let collection_id = create_test_collection(&CollectionMode::NFT, 1);135136 let data = default_nft_data();137 create_test_item(collection_id, &data.clone().into());138 let item = TemplateModule::nft_item_id(collection_id, 1).unwrap();139 assert_eq!(item.const_data, data.const_data.into_inner());140 assert_eq!(item.variable_data, data.variable_data.into_inner());141 });142}143144// Use cases tests region145// #region146#[test]147fn create_nft_multiple_items() {148 new_test_ext().execute_with(|| {149 create_test_collection(&CollectionMode::NFT, 1);150151 let origin1 = Origin::signed(1);152153 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];154155 assert_ok!(TemplateModule::create_multiple_items(156 origin1,157 1,158 account(1),159 items_data160 .clone()161 .into_iter()162 .map(|d| { d.into() })163 .collect()164 ));165 for (index, data) in items_data.into_iter().enumerate() {166 let item = TemplateModule::nft_item_id(1, (index + 1) as TokenId).unwrap();167 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());168 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());169 }170 });171}172173#[test]174fn create_refungible_item() {175 new_test_ext().execute_with(|| {176 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);177178 let data = default_re_fungible_data();179 create_test_item(collection_id, &data.clone().into());180 let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();181 let balance = TemplateModule::balance(collection_id, 1, account(1));182 assert_eq!(item.const_data, data.const_data.into_inner());183 assert_eq!(item.variable_data, data.variable_data.into_inner());184 assert_eq!(balance, 1023);185 });186}187188#[test]189fn create_multiple_refungible_items() {190 new_test_ext().execute_with(|| {191 create_test_collection(&CollectionMode::ReFungible, 1);192193 let origin1 = Origin::signed(1);194195 let items_data = vec![196 default_re_fungible_data(),197 default_re_fungible_data(),198 default_re_fungible_data(),199 ];200201 assert_ok!(TemplateModule::create_multiple_items(202 origin1,203 1,204 account(1),205 items_data206 .clone()207 .into_iter()208 .map(|d| { d.into() })209 .collect()210 ));211 for (index, data) in items_data.into_iter().enumerate() {212 let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId).unwrap();213 let balance = TemplateModule::balance(1, 1, account(1));214 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());215 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());216 assert_eq!(balance, 1023);217 }218 });219}220221#[test]222fn create_fungible_item() {223 new_test_ext().execute_with(|| {224 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);225226 let data = default_fungible_data();227 create_test_item(collection_id, &data.into());228229 assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).value, 5);230 });231}232233//#[test]234// fn create_multiple_fungible_items() {235// new_test_ext().execute_with(|| {236// default_limits();237238// create_test_collection(&CollectionMode::Fungible(3), 1);239240// let origin1 = Origin::signed(1);241242// let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];243244// assert_ok!(TemplateModule::create_multiple_items(245// origin1.clone(),246// 1,247// 1,248// items_data.clone().into_iter().map(|d| { d.into() }).collect()249// ));250251// for (index, _) in items_data.iter().enumerate() {252// assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);253// }254// assert_eq!(TemplateModule::balance_count(1, 1), 3000);255// assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);256// });257// }258259#[test]260fn transfer_fungible_item() {261 new_test_ext().execute_with(|| {262 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);263264 let origin1 = Origin::signed(1);265 let origin2 = Origin::signed(2);266267 let data = default_fungible_data();268 create_test_item(collection_id, &data.into());269270 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 5);271 assert_eq!(TemplateModule::balance_count(1, 1), 5);272273 // change owner scenario274 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 5));275 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 0);276 assert_eq!(TemplateModule::balance_count(1, 1), 0);277 assert_eq!(TemplateModule::balance_count(1, 2), 5);278279 // split item scenario280 assert_ok!(TemplateModule::transfer(281 origin2.clone(),282 account(3),283 1,284 1,285 3286 ));287 assert_eq!(TemplateModule::balance_count(1, 2), 2);288 assert_eq!(TemplateModule::balance_count(1, 3), 3);289290 // split item and new owner has account scenario291 assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 1));292 assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 1);293 assert_eq!(TemplateModule::fungible_item_id(1, 3).value, 4);294 assert_eq!(TemplateModule::balance_count(1, 2), 1);295 assert_eq!(TemplateModule::balance_count(1, 3), 4);296 });297}298299#[test]300fn transfer_refungible_item() {301 new_test_ext().execute_with(|| {302 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);303304 let data = default_re_fungible_data();305 create_test_item(collection_id, &data.clone().into());306307 let origin1 = Origin::signed(1);308 let origin2 = Origin::signed(2);309 {310 let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();311 let balance = TemplateModule::balance(collection_id, 1, account(1));312 assert_eq!(item.const_data, data.const_data.into_inner());313 assert_eq!(item.variable_data, data.variable_data.into_inner());314 assert_eq!(balance, 1023);315 }316 assert_eq!(TemplateModule::balance_count(1, 1), 1023);317 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);318319 // change owner scenario320 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1023));321322 let balance2 = TemplateModule::balance(collection_id, 1, account(2));323 assert_eq!(balance2, 1023);324 assert_eq!(TemplateModule::balance_count(1, 1), 0);325 assert_eq!(TemplateModule::balance_count(1, 2), 1023);326 // assert_eq!(TemplateModule::address_tokens(1, 1), []);327 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);328329 // split item scenario330 assert_ok!(TemplateModule::transfer(331 origin2.clone(),332 account(3),333 1,334 1,335 500336 ));337 {338 let item = TemplateModule::refungible_item_id(1, 1).unwrap();339 let balance2 = TemplateModule::balance(collection_id, 1, account(2));340 let balance3 = TemplateModule::balance(collection_id, 1, account(3));341 assert_eq!(balance2, 523);342 assert_eq!(balance3, 500);343 }344 assert_eq!(TemplateModule::balance_count(1, 2), 523);345 assert_eq!(TemplateModule::balance_count(1, 3), 500);346 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);347 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);348349 // split item and new owner has account scenario350 assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 200));351 {352 let item = TemplateModule::refungible_item_id(1, 1).unwrap();353 let balance2 = TemplateModule::balance(collection_id, 1, account(2));354 let balance3 = TemplateModule::balance(collection_id, 1, account(3));355 assert_eq!(balance2, 323);356 assert_eq!(balance3, 700);357 }358 assert_eq!(TemplateModule::balance_count(1, 2), 323);359 assert_eq!(TemplateModule::balance_count(1, 3), 700);360 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);361 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);362 });363}364365#[test]366fn transfer_nft_item() {367 new_test_ext().execute_with(|| {368 let collection_id = create_test_collection(&CollectionMode::NFT, 1);369370 let data = default_nft_data();371 create_test_item(collection_id, &data.into());372 assert_eq!(TemplateModule::balance_count(1, 1), 1);373 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);374375 let origin1 = Origin::signed(1);376 // default scenario377 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1000));378 assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(2));379 assert_eq!(TemplateModule::balance_count(1, 1), 0);380 assert_eq!(TemplateModule::balance_count(1, 2), 1);381 // assert_eq!(TemplateModule::address_tokens(1, 1), []);382 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);383 });384}385386#[test]387fn nft_approve_and_transfer_from() {388 new_test_ext().execute_with(|| {389 let collection_id = create_test_collection(&CollectionMode::NFT, 1);390391 let data = default_nft_data();392 create_test_item(collection_id, &data.into());393394 let origin1 = Origin::signed(1);395 let origin2 = Origin::signed(2);396397 assert_eq!(TemplateModule::balance_count(1, 1), 1);398 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);399400 // neg transfer401 assert_noop!(402 TemplateModule::transfer_from(origin2.clone(), account(1), account(2), 1, 1, 1),403 Error::<Test>::NoPermission404 );405406 // do approve407 assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 5));408 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);409 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);410411 assert_ok!(TemplateModule::transfer_from(412 origin2,413 account(1),414 account(3),415 1,416 1,417 1418 ));419 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);420 });421}422423#[test]424fn nft_approve_and_transfer_from_allow_list() {425 new_test_ext().execute_with(|| {426 let collection_id = create_test_collection(&CollectionMode::NFT, 1);427428 let origin1 = Origin::signed(1);429 let origin2 = Origin::signed(2);430431 let data = default_nft_data();432 create_test_item(collection_id, &data.clone().into());433434 assert_eq!(435 &TemplateModule::nft_item_id(1, 1).unwrap().const_data,436 &data.const_data.into_inner()437 );438 assert_eq!(TemplateModule::balance_count(1, 1), 1);439 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);440441 assert_ok!(TemplateModule::set_mint_permission(442 origin1.clone(),443 1,444 true445 ));446 assert_ok!(TemplateModule::set_public_access_mode(447 origin1.clone(),448 1,449 AccessMode::AllowList450 ));451 assert_ok!(TemplateModule::add_to_allow_list(452 origin1.clone(),453 1,454 account(1)455 ));456 assert_ok!(TemplateModule::add_to_allow_list(457 origin1.clone(),458 1,459 account(2)460 ));461 assert_ok!(TemplateModule::add_to_allow_list(462 origin1.clone(),463 1,464 account(3)465 ));466467 // do approve468 assert_ok!(TemplateModule::approve(469 origin1.clone(),470 account(2),471 1,472 1,473 5474 ));475 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);476 assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));477 assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);478479 assert_ok!(TemplateModule::transfer_from(480 origin2,481 account(1),482 account(3),483 1,484 1,485 1486 ));487 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);488 });489}490491#[test]492fn refungible_approve_and_transfer_from() {493 new_test_ext().execute_with(|| {494 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);495496 let origin1 = Origin::signed(1);497 let origin2 = Origin::signed(2);498499 let data = default_re_fungible_data();500 create_test_item(collection_id, &data.into());501502 assert_eq!(TemplateModule::balance_count(1, 1), 1023);503 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);504505 assert_ok!(TemplateModule::set_mint_permission(506 origin1.clone(),507 1,508 true509 ));510 assert_ok!(TemplateModule::set_public_access_mode(511 origin1.clone(),512 1,513 AccessMode::AllowList514 ));515 assert_ok!(TemplateModule::add_to_allow_list(516 origin1.clone(),517 1,518 account(1)519 ));520 assert_ok!(TemplateModule::add_to_allow_list(521 origin1.clone(),522 1,523 account(2)524 ));525 assert_ok!(TemplateModule::add_to_allow_list(526 origin1.clone(),527 1,528 account(3)529 ));530531 // do approve532 assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1023));533 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1023);534535 assert_ok!(TemplateModule::transfer_from(536 origin2,537 account(1),538 account(3),539 1,540 1,541 100542 ));543 assert_eq!(TemplateModule::balance_count(1, 1), 923);544 assert_eq!(TemplateModule::balance_count(1, 3), 100);545 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);546 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);547548 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 923);549 });550}551552#[test]553fn fungible_approve_and_transfer_from() {554 new_test_ext().execute_with(|| {555 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);556557 let data = default_fungible_data();558 create_test_item(collection_id, &data.into());559560 let origin1 = Origin::signed(1);561 let origin2 = Origin::signed(2);562563 assert_eq!(TemplateModule::balance_count(1, 1), 5);564565 assert_ok!(TemplateModule::set_mint_permission(566 origin1.clone(),567 1,568 true569 ));570 assert_ok!(TemplateModule::set_public_access_mode(571 origin1.clone(),572 1,573 AccessMode::AllowList574 ));575 assert_ok!(TemplateModule::add_to_allow_list(576 origin1.clone(),577 1,578 account(1)579 ));580 assert_ok!(TemplateModule::add_to_allow_list(581 origin1.clone(),582 1,583 account(2)584 ));585 assert_ok!(TemplateModule::add_to_allow_list(586 origin1.clone(),587 1,588 account(3)589 ));590591 // do approve592 assert_ok!(TemplateModule::approve(593 origin1.clone(),594 account(2),595 1,596 1,597 5598 ));599 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);600 assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));601 assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);602 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);603604 assert_ok!(TemplateModule::transfer_from(605 origin2.clone(),606 account(1),607 account(3),608 1,609 1,610 4611 ));612 assert_eq!(TemplateModule::balance_count(1, 1), 1);613 assert_eq!(TemplateModule::balance_count(1, 3), 4);614615 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);616617 assert_noop!(618 TemplateModule::transfer_from(origin2, account(1), account(3), 1, 1, 4),619 Error::<Test>::NoPermission620 );621 });622}623624#[test]625fn change_collection_owner() {626 new_test_ext().execute_with(|| {627 let collection_id = create_test_collection(&CollectionMode::NFT, 1);628629 let origin1 = Origin::signed(1);630 assert_ok!(TemplateModule::change_collection_owner(631 origin1,632 collection_id,633 2634 ));635 assert_eq!(636 TemplateModule::collection_id(collection_id).unwrap().owner,637 2638 );639 });640}641642#[test]643fn destroy_collection() {644 new_test_ext().execute_with(|| {645 let collection_id = create_test_collection(&CollectionMode::NFT, 1);646647 let origin1 = Origin::signed(1);648 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));649 });650}651652#[test]653fn burn_nft_item() {654 new_test_ext().execute_with(|| {655 let collection_id = create_test_collection(&CollectionMode::NFT, 1);656657 let origin1 = Origin::signed(1);658 assert_ok!(TemplateModule::add_collection_admin(659 origin1.clone(),660 collection_id,661 account(2)662 ));663664 let data = default_nft_data();665 create_test_item(collection_id, &data.into());666667 // check balance (collection with id = 1, user id = 1)668 assert_eq!(TemplateModule::balance_count(1, 1), 1);669670 // burn item671 assert_ok!(TemplateModule::burn_item(672 origin1.clone(),673 collection_id,674 1,675 1676 ));677 assert_noop!(678 TemplateModule::burn_item(origin1, collection_id, 1, 1),679 Error::<Test>::TokenNotFound680 );681682 assert_eq!(TemplateModule::balance_count(1, 1), 0);683 });684}685686#[test]687fn burn_fungible_item() {688 new_test_ext().execute_with(|| {689 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);690691 let origin1 = Origin::signed(1);692 assert_ok!(TemplateModule::add_collection_admin(693 origin1.clone(),694 collection_id,695 account(2)696 ));697698 let data = default_fungible_data();699 create_test_item(collection_id, &data.into());700701 // check balance (collection with id = 1, user id = 1)702 assert_eq!(TemplateModule::balance_count(1, 1), 5);703704 // burn item705 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 5));706 assert_noop!(707 TemplateModule::burn_item(origin1, 1, 1, 5),708 Error::<Test>::TokenValueNotEnough709 );710711 assert_eq!(TemplateModule::balance_count(1, 1), 0);712 });713}714715#[test]716fn burn_refungible_item() {717 new_test_ext().execute_with(|| {718 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);719 let origin1 = Origin::signed(1);720721 assert_ok!(TemplateModule::set_mint_permission(722 origin1.clone(),723 collection_id,724 true725 ));726 assert_ok!(TemplateModule::set_public_access_mode(727 origin1.clone(),728 collection_id,729 AccessMode::AllowList730 ));731 assert_ok!(TemplateModule::add_to_allow_list(732 origin1.clone(),733 1,734 account(1)735 ));736737 assert_ok!(TemplateModule::add_collection_admin(738 origin1.clone(),739 1,740 account(2)741 ));742743 let data = default_re_fungible_data();744 create_test_item(collection_id, &data.into());745746 // check balance (collection with id = 1, user id = 2)747 assert_eq!(TemplateModule::balance_count(1, 1), 1023);748749 // burn item750 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 1023));751 assert_noop!(752 TemplateModule::burn_item(origin1, 1, 1, 1023),753 Error::<Test>::TokenNotFound754 );755756 assert_eq!(TemplateModule::balance_count(1, 1), 0);757 });758}759760#[test]761fn add_collection_admin() {762 new_test_ext().execute_with(|| {763 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);764 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);765 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);766767 let origin1 = Origin::signed(1);768769 // collection admin770 assert_ok!(TemplateModule::add_collection_admin(771 origin1.clone(),772 collection1_id,773 account(2)774 ));775 assert_ok!(TemplateModule::add_collection_admin(776 origin1,777 collection1_id,778 account(3)779 ));780781 assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(2)),);782 assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(3)),);783 });784}785786#[test]787fn remove_collection_admin() {788 new_test_ext().execute_with(|| {789 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);790 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);791 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);792793 let origin1 = Origin::signed(1);794 let origin2 = Origin::signed(2);795796 // collection admin797 assert_ok!(TemplateModule::add_collection_admin(798 origin1.clone(),799 collection1_id,800 account(2)801 ));802 assert_ok!(TemplateModule::add_collection_admin(803 origin1,804 collection1_id,805 account(3)806 ));807808 assert!(TemplateModule::admin_list_collection(1).contains(&account(2)),);809 assert!(TemplateModule::admin_list_collection(1).contains(&account(3)),);810811 // remove admin812 assert_ok!(TemplateModule::remove_collection_admin(813 origin2,814 1,815 account(3)816 ));817 assert!(!TemplateModule::admin_list_collection(1).contains(&account(3)),);818 });819}820821#[test]822fn balance_of() {823 new_test_ext().execute_with(|| {824 let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);825 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);826 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, 3);827828 // check balance before829 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);830 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);831 assert_eq!(832 TemplateModule::balance_count(re_fungible_collection_id, 1),833 0834 );835836 let nft_data = default_nft_data();837 create_test_item(nft_collection_id, &nft_data.into());838839 let fungible_data = default_fungible_data();840 create_test_item(fungible_collection_id, &fungible_data.into());841842 let re_fungible_data = default_re_fungible_data();843 create_test_item(re_fungible_collection_id, &re_fungible_data.into());844845 // check balance (collection with id = 1, user id = 1)846 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);847 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 5);848 assert_eq!(849 TemplateModule::balance_count(re_fungible_collection_id, 1),850 1023851 );852 assert_eq!(853 TemplateModule::nft_item_id(nft_collection_id, 1)854 .unwrap()855 .owner,856 account(1)857 );858 assert_eq!(859 TemplateModule::fungible_item_id(fungible_collection_id, 1).value,860 5861 );862 assert_eq!(863 TemplateModule::refungible_item_id(re_fungible_collection_id, 1)864 .unwrap()865 .owner[0]866 .owner,867 account(1)868 );869 });870}871872#[test]873fn approve() {874 new_test_ext().execute_with(|| {875 let collection_id = create_test_collection(&CollectionMode::NFT, 1);876877 let data = default_nft_data();878 create_test_item(collection_id, &data.into());879880 let origin1 = Origin::signed(1);881882 // approve883 assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1));884 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);885 });886}887888#[test]889fn transfer_from() {890 new_test_ext().execute_with(|| {891 let collection_id = create_test_collection(&CollectionMode::NFT, 1);892 let origin1 = Origin::signed(1);893 let origin2 = Origin::signed(2);894895 let data = default_nft_data();896 create_test_item(collection_id, &data.into());897898 // approve899 assert_ok!(TemplateModule::approve(900 origin1.clone(),901 account(2),902 1,903 1,904 1905 ));906 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);907908 assert_ok!(TemplateModule::set_mint_permission(909 origin1.clone(),910 1,911 true912 ));913 assert_ok!(TemplateModule::set_public_access_mode(914 origin1.clone(),915 1,916 AccessMode::AllowList917 ));918 assert_ok!(TemplateModule::add_to_allow_list(919 origin1.clone(),920 1,921 account(1)922 ));923 assert_ok!(TemplateModule::add_to_allow_list(924 origin1.clone(),925 1,926 account(2)927 ));928 assert_ok!(TemplateModule::add_to_allow_list(origin1, 1, account(3)));929930 assert_ok!(TemplateModule::transfer_from(931 origin2,932 account(1),933 account(2),934 1,935 1,936 1937 ));938939 // after transfer940 assert_eq!(TemplateModule::balance_count(1, 1), 0);941 assert_eq!(TemplateModule::balance_count(1, 2), 1);942 });943}944945// #endregion946947// Coverage tests region948// #region949950#[test]951fn owner_can_add_address_to_allow_list() {952 new_test_ext().execute_with(|| {953 let collection_id = create_test_collection(&CollectionMode::NFT, 1);954955 let origin1 = Origin::signed(1);956 assert_ok!(TemplateModule::add_to_allow_list(957 origin1,958 collection_id,959 account(2)960 ));961 assert!(TemplateModule::allow_list(collection_id, 2));962 });963}964965#[test]966fn admin_can_add_address_to_allow_list() {967 new_test_ext().execute_with(|| {968 let collection_id = create_test_collection(&CollectionMode::NFT, 1);969 let origin1 = Origin::signed(1);970 let origin2 = Origin::signed(2);971972 assert_ok!(TemplateModule::add_collection_admin(973 origin1,974 collection_id,975 account(2)976 ));977 assert_ok!(TemplateModule::add_to_allow_list(978 origin2,979 collection_id,980 account(3)981 ));982 assert!(TemplateModule::allow_list(collection_id, 3));983 });984}985986#[test]987fn nonprivileged_user_cannot_add_address_to_allow_list() {988 new_test_ext().execute_with(|| {989 let collection_id = create_test_collection(&CollectionMode::NFT, 1);990991 let origin2 = Origin::signed(2);992 assert_noop!(993 TemplateModule::add_to_allow_list(origin2, collection_id, account(3)),994 Error::<Test>::NoPermission995 );996 });997}998999#[test]1000fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {1001 new_test_ext().execute_with(|| {1002 let origin1 = Origin::signed(1);10031004 assert_noop!(1005 TemplateModule::add_to_allow_list(origin1, 1, account(2)),1006 Error::<Test>::CollectionNotFound1007 );1008 });1009}10101011#[test]1012fn nobody_can_add_address_to_allow_list_of_deleted_collection() {1013 new_test_ext().execute_with(|| {1014 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10151016 let origin1 = Origin::signed(1);1017 assert_ok!(TemplateModule::destroy_collection(1018 origin1.clone(),1019 collection_id1020 ));1021 assert_noop!(1022 TemplateModule::add_to_allow_list(origin1, collection_id, account(2)),1023 Error::<Test>::CollectionNotFound1024 );1025 });1026}10271028// If address is already added to allow list, nothing happens1029#[test]1030fn address_is_already_added_to_allow_list() {1031 new_test_ext().execute_with(|| {1032 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1033 let origin1 = Origin::signed(1);10341035 assert_ok!(TemplateModule::add_to_allow_list(1036 origin1.clone(),1037 collection_id,1038 account(2)1039 ));1040 assert_ok!(TemplateModule::add_to_allow_list(1041 origin1,1042 collection_id,1043 account(2)1044 ));1045 assert!(TemplateModule::allow_list(collection_id, 2));1046 });1047}10481049#[test]1050fn owner_can_remove_address_from_allow_list() {1051 new_test_ext().execute_with(|| {1052 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10531054 let origin1 = Origin::signed(1);1055 assert_ok!(TemplateModule::add_to_allow_list(1056 origin1.clone(),1057 collection_id,1058 account(2)1059 ));1060 assert_ok!(TemplateModule::remove_from_allow_list(1061 origin1,1062 collection_id,1063 account(2)1064 ));1065 assert!(!TemplateModule::allow_list(collection_id, 2));1066 });1067}10681069#[test]1070fn admin_can_remove_address_from_allow_list() {1071 new_test_ext().execute_with(|| {1072 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1073 let origin1 = Origin::signed(1);1074 let origin2 = Origin::signed(2);10751076 assert_ok!(TemplateModule::add_collection_admin(1077 origin1.clone(),1078 collection_id,1079 account(2)1080 ));10811082 assert_ok!(TemplateModule::add_to_allow_list(1083 origin1,1084 collection_id,1085 account(3)1086 ));1087 assert_ok!(TemplateModule::remove_from_allow_list(1088 origin2,1089 collection_id,1090 account(3)1091 ));1092 assert!(!TemplateModule::allow_list(collection_id, 3));1093 });1094}10951096#[test]1097fn nonprivileged_user_cannot_remove_address_from_allow_list() {1098 new_test_ext().execute_with(|| {1099 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1100 let origin1 = Origin::signed(1);1101 let origin2 = Origin::signed(2);11021103 assert_ok!(TemplateModule::add_to_allow_list(1104 origin1,1105 collection_id,1106 account(2)1107 ));1108 assert_noop!(1109 TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1110 Error::<Test>::NoPermission1111 );1112 assert!(TemplateModule::allow_list(collection_id, 2));1113 });1114}11151116#[test]1117fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {1118 new_test_ext().execute_with(|| {1119 let origin1 = Origin::signed(1);11201121 assert_noop!(1122 TemplateModule::remove_from_allow_list(origin1, 1, account(2)),1123 Error::<Test>::CollectionNotFound1124 );1125 });1126}11271128#[test]1129fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {1130 new_test_ext().execute_with(|| {1131 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1132 let origin1 = Origin::signed(1);1133 let origin2 = Origin::signed(2);11341135 assert_ok!(TemplateModule::add_to_allow_list(1136 origin1.clone(),1137 collection_id,1138 account(2)1139 ));1140 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));1141 assert_noop!(1142 TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1143 Error::<Test>::CollectionNotFound1144 );1145 assert!(!TemplateModule::allow_list(collection_id, 2));1146 });1147}11481149// If address is already removed from allow list, nothing happens1150#[test]1151fn address_is_already_removed_from_allow_list() {1152 new_test_ext().execute_with(|| {1153 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1154 let origin1 = Origin::signed(1);11551156 assert_ok!(TemplateModule::add_to_allow_list(1157 origin1.clone(),1158 collection_id,1159 account(2)1160 ));1161 assert_ok!(TemplateModule::remove_from_allow_list(1162 origin1.clone(),1163 collection_id,1164 account(2)1165 ));1166 assert_ok!(TemplateModule::remove_from_allow_list(1167 origin1,1168 collection_id,1169 account(2)1170 ));1171 assert!(!TemplateModule::allow_list(collection_id, 2));1172 });1173}11741175// If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom (2 tests)1176#[test]1177fn allow_list_test_1() {1178 new_test_ext().execute_with(|| {1179 let collection_id = create_test_collection(&CollectionMode::NFT, 1);11801181 let origin1 = Origin::signed(1);11821183 let data = default_nft_data();1184 create_test_item(collection_id, &data.into());11851186 assert_ok!(TemplateModule::set_public_access_mode(1187 origin1.clone(),1188 collection_id,1189 AccessMode::AllowList1190 ));1191 assert_ok!(TemplateModule::add_to_allow_list(1192 origin1.clone(),1193 collection_id,1194 account(2)1195 ));11961197 assert_noop!(1198 TemplateModule::transfer(origin1, account(3), 1, 1, 1),1199 Error::<Test>::AddresNotInAllowList1200 );1201 });1202}12031204#[test]1205fn allow_list_test_2() {1206 new_test_ext().execute_with(|| {1207 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1208 let origin1 = Origin::signed(1);12091210 let data = default_nft_data();1211 create_test_item(collection_id, &data.into());12121213 assert_ok!(TemplateModule::set_public_access_mode(1214 origin1.clone(),1215 collection_id,1216 AccessMode::AllowList1217 ));1218 assert_ok!(TemplateModule::add_to_allow_list(1219 origin1.clone(),1220 1,1221 account(1)1222 ));1223 assert_ok!(TemplateModule::add_to_allow_list(1224 origin1.clone(),1225 1,1226 account(2)1227 ));12281229 // do approve1230 assert_ok!(TemplateModule::approve(1231 origin1.clone(),1232 account(1),1233 1,1234 1,1235 11236 ));1237 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);12381239 assert_ok!(TemplateModule::remove_from_allow_list(1240 origin1.clone(),1241 1,1242 account(1)1243 ));12441245 assert_noop!(1246 TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),1247 Error::<Test>::AddresNotInAllowList1248 );1249 });1250}12511252// If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom (2 tests)1253#[test]1254fn allow_list_test_3() {1255 new_test_ext().execute_with(|| {1256 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12571258 let origin1 = Origin::signed(1);12591260 let data = default_nft_data();1261 create_test_item(collection_id, &data.into());12621263 assert_ok!(TemplateModule::set_public_access_mode(1264 origin1.clone(),1265 collection_id,1266 AccessMode::AllowList1267 ));1268 assert_ok!(TemplateModule::add_to_allow_list(1269 origin1.clone(),1270 1,1271 account(1)1272 ));12731274 assert_noop!(1275 TemplateModule::transfer(origin1, account(3), 1, 1, 1),1276 Error::<Test>::AddresNotInAllowList1277 );1278 });1279}12801281#[test]1282fn allow_list_test_4() {1283 new_test_ext().execute_with(|| {1284 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12851286 let origin1 = Origin::signed(1);12871288 let data = default_nft_data();1289 create_test_item(collection_id, &data.into());12901291 assert_ok!(TemplateModule::set_public_access_mode(1292 origin1.clone(),1293 collection_id,1294 AccessMode::AllowList1295 ));1296 assert_ok!(TemplateModule::add_to_allow_list(1297 origin1.clone(),1298 collection_id,1299 account(1)1300 ));1301 assert_ok!(TemplateModule::add_to_allow_list(1302 origin1.clone(),1303 collection_id,1304 account(2)1305 ));13061307 // do approve1308 assert_ok!(TemplateModule::approve(1309 origin1.clone(),1310 account(1),1311 1,1312 1,1313 11314 ));1315 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);13161317 assert_ok!(TemplateModule::remove_from_allow_list(1318 origin1.clone(),1319 collection_id,1320 account(2)1321 ));13221323 assert_noop!(1324 TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),1325 Error::<Test>::AddresNotInAllowList1326 );1327 });1328}13291330// If Public Access mode is set to AllowList, tokens can’t be destroyed by a non-allowlisted address (even if it owned them before enabling AllowList mode)1331#[test]1332fn allow_list_test_5() {1333 new_test_ext().execute_with(|| {1334 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13351336 let origin1 = Origin::signed(1);13371338 let data = default_nft_data();1339 create_test_item(collection_id, &data.into());13401341 assert_ok!(TemplateModule::set_public_access_mode(1342 origin1.clone(),1343 collection_id,1344 AccessMode::AllowList1345 ));1346 assert_noop!(1347 TemplateModule::burn_item(origin1.clone(), 1, 1, 5),1348 Error::<Test>::AddresNotInAllowList1349 );1350 });1351}13521353// If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method).1354#[test]1355fn allow_list_test_6() {1356 new_test_ext().execute_with(|| {1357 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13581359 let origin1 = Origin::signed(1);13601361 let data = default_nft_data();1362 create_test_item(collection_id, &data.into());13631364 assert_ok!(TemplateModule::set_public_access_mode(1365 origin1.clone(),1366 collection_id,1367 AccessMode::AllowList1368 ));13691370 // do approve1371 assert_noop!(1372 TemplateModule::approve(origin1, account(1), 1, 1, 5),1373 Error::<Test>::AddresNotInAllowList1374 );1375 });1376}13771378// If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests) and1379// tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests)1380#[test]1381fn allow_list_test_7() {1382 new_test_ext().execute_with(|| {1383 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13841385 let data = default_nft_data();1386 create_test_item(collection_id, &data.into());13871388 let origin1 = Origin::signed(1);13891390 assert_ok!(TemplateModule::set_public_access_mode(1391 origin1.clone(),1392 collection_id,1393 AccessMode::AllowList1394 ));1395 assert_ok!(TemplateModule::add_to_allow_list(1396 origin1.clone(),1397 collection_id,1398 account(1)1399 ));1400 assert_ok!(TemplateModule::add_to_allow_list(1401 origin1.clone(),1402 collection_id,1403 account(2)1404 ));14051406 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1));1407 });1408}14091410#[test]1411fn allow_list_test_8() {1412 new_test_ext().execute_with(|| {1413 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14141415 let data = default_nft_data();1416 create_test_item(collection_id, &data.into());14171418 let origin1 = Origin::signed(1);14191420 assert_ok!(TemplateModule::set_public_access_mode(1421 origin1.clone(),1422 collection_id,1423 AccessMode::AllowList1424 ));1425 assert_ok!(TemplateModule::add_to_allow_list(1426 origin1.clone(),1427 collection_id,1428 account(1)1429 ));1430 assert_ok!(TemplateModule::add_to_allow_list(1431 origin1.clone(),1432 collection_id,1433 account(2)1434 ));14351436 // do approve1437 assert_ok!(TemplateModule::approve(1438 origin1.clone(),1439 account(1),1440 1,1441 1,1442 51443 ));1444 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 5);14451446 assert_ok!(TemplateModule::transfer_from(1447 origin1,1448 account(1),1449 account(2),1450 1,1451 1,1452 11453 ));1454 });1455}14561457// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner.1458#[test]1459fn allow_list_test_9() {1460 new_test_ext().execute_with(|| {1461 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1462 let origin1 = Origin::signed(1);14631464 assert_ok!(TemplateModule::set_public_access_mode(1465 origin1.clone(),1466 collection_id,1467 AccessMode::AllowList1468 ));1469 assert_ok!(TemplateModule::set_mint_permission(1470 origin1,1471 collection_id,1472 false1473 ));14741475 let data = default_nft_data();1476 create_test_item(collection_id, &data.into());1477 });1478}14791480// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin.1481#[test]1482fn allow_list_test_10() {1483 new_test_ext().execute_with(|| {1484 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14851486 let origin1 = Origin::signed(1);1487 let origin2 = Origin::signed(2);14881489 assert_ok!(TemplateModule::set_public_access_mode(1490 origin1.clone(),1491 collection_id,1492 AccessMode::AllowList1493 ));1494 assert_ok!(TemplateModule::set_mint_permission(1495 origin1.clone(),1496 collection_id,1497 false1498 ));14991500 assert_ok!(TemplateModule::add_collection_admin(1501 origin1,1502 collection_id,1503 account(2)1504 ));15051506 assert_ok!(TemplateModule::create_item(1507 origin2,1508 collection_id,1509 account(2),1510 default_nft_data().into()1511 ));1512 });1513}15141515// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and allow listed address.1516#[test]1517fn allow_list_test_11() {1518 new_test_ext().execute_with(|| {1519 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15201521 let origin1 = Origin::signed(1);1522 let origin2 = Origin::signed(2);15231524 assert_ok!(TemplateModule::set_public_access_mode(1525 origin1.clone(),1526 collection_id,1527 AccessMode::AllowList1528 ));1529 assert_ok!(TemplateModule::set_mint_permission(1530 origin1.clone(),1531 collection_id,1532 false1533 ));1534 assert_ok!(TemplateModule::add_to_allow_list(1535 origin1,1536 collection_id,1537 account(2)1538 ));15391540 assert_noop!(1541 TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1542 Error::<Test>::PublicMintingNotAllowed1543 );1544 });1545}15461547// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-allow listed address.1548#[test]1549fn allow_list_test_12() {1550 new_test_ext().execute_with(|| {1551 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15521553 let origin1 = Origin::signed(1);1554 let origin2 = Origin::signed(2);15551556 assert_ok!(TemplateModule::set_public_access_mode(1557 origin1.clone(),1558 collection_id,1559 AccessMode::AllowList1560 ));1561 assert_ok!(TemplateModule::set_mint_permission(1562 origin1,1563 collection_id,1564 false1565 ));15661567 assert_noop!(1568 TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1569 Error::<Test>::PublicMintingNotAllowed1570 );1571 });1572}15731574// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner.1575#[test]1576fn allow_list_test_13() {1577 new_test_ext().execute_with(|| {1578 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15791580 let origin1 = Origin::signed(1);15811582 assert_ok!(TemplateModule::set_public_access_mode(1583 origin1.clone(),1584 collection_id,1585 AccessMode::AllowList1586 ));1587 assert_ok!(TemplateModule::set_mint_permission(1588 origin1,1589 collection_id,1590 true1591 ));15921593 let data = default_nft_data();1594 create_test_item(collection_id, &data.into());1595 });1596}15971598// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin.1599#[test]1600fn allow_list_test_14() {1601 new_test_ext().execute_with(|| {1602 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16031604 let origin1 = Origin::signed(1);1605 let origin2 = Origin::signed(2);16061607 assert_ok!(TemplateModule::set_public_access_mode(1608 origin1.clone(),1609 collection_id,1610 AccessMode::AllowList1611 ));1612 assert_ok!(TemplateModule::set_mint_permission(1613 origin1.clone(),1614 collection_id,1615 true1616 ));16171618 assert_ok!(TemplateModule::add_collection_admin(1619 origin1,1620 collection_id,1621 account(2)1622 ));16231624 assert_ok!(TemplateModule::create_item(1625 origin2,1626 1,1627 account(2),1628 default_nft_data().into()1629 ));1630 });1631}16321633// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-allow listed address.1634#[test]1635fn allow_list_test_15() {1636 new_test_ext().execute_with(|| {1637 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16381639 let origin1 = Origin::signed(1);1640 let origin2 = Origin::signed(2);16411642 assert_ok!(TemplateModule::set_public_access_mode(1643 origin1.clone(),1644 collection_id,1645 AccessMode::AllowList1646 ));1647 assert_ok!(TemplateModule::set_mint_permission(1648 origin1,1649 collection_id,1650 true1651 ));16521653 assert_noop!(1654 TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1655 Error::<Test>::AddresNotInAllowList1656 );1657 });1658}16591660// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by non-privileged and allow listed address.1661#[test]1662fn allow_list_test_16() {1663 new_test_ext().execute_with(|| {1664 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16651666 let origin1 = Origin::signed(1);1667 let origin2 = Origin::signed(2);16681669 assert_ok!(TemplateModule::set_public_access_mode(1670 origin1.clone(),1671 collection_id,1672 AccessMode::AllowList1673 ));1674 assert_ok!(TemplateModule::set_mint_permission(1675 origin1.clone(),1676 collection_id,1677 true1678 ));1679 assert_ok!(TemplateModule::add_to_allow_list(1680 origin1,1681 collection_id,1682 account(2)1683 ));16841685 assert_ok!(TemplateModule::create_item(1686 origin2,1687 1,1688 account(2),1689 default_nft_data().into()1690 ));1691 });1692}16931694// Total number of collections. Positive test1695#[test]1696fn total_number_collections_bound() {1697 new_test_ext().execute_with(|| {1698 create_test_collection(&CollectionMode::NFT, 1);1699 });1700}17011702// Total number of collections. Negotive test1703#[test]1704fn total_number_collections_bound_neg() {1705 new_test_ext().execute_with(|| {1706 let origin1 = Origin::signed(1);17071708 for i in 0..COLLECTION_NUMBER_LIMIT {1709 create_test_collection(&CollectionMode::NFT, i + 1);1710 }17111712 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1713 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1714 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();17151716 // 11-th collection in chain. Expects error1717 assert_noop!(1718 TemplateModule::create_collection(1719 origin1,1720 col_name1,1721 col_desc1,1722 token_prefix1,1723 CollectionMode::NFT1724 ),1725 Error::<Test>::TotalCollectionsLimitExceeded1726 );1727 });1728}17291730// Owned tokens by a single address. Positive test1731#[test]1732fn owned_tokens_bound() {1733 new_test_ext().execute_with(|| {1734 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17351736 let data = default_nft_data();1737 create_test_item(collection_id, &data.clone().into());1738 create_test_item(collection_id, &data.into());1739 });1740}17411742// Owned tokens by a single address. Negotive test1743#[test]1744fn owned_tokens_bound_neg() {1745 new_test_ext().execute_with(|| {1746 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17471748 let origin1 = Origin::signed(1);17491750 for _ in 0..ACCOUNT_TOKEN_OWNERSHIP_LIMIT {1751 let data = default_nft_data();1752 create_test_item(collection_id, &data.clone().into());1753 }17541755 let data = default_nft_data();1756 assert_noop!(1757 TemplateModule::create_item(origin1, 1, account(1), data.into()),1758 Error::<Test>::AccountTokenLimitExceeded1759 );1760 });1761}17621763// Number of collection admins. Positive test1764#[test]1765fn collection_admins_bound() {1766 new_test_ext().execute_with(|| {1767 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17681769 let origin1 = Origin::signed(1);17701771 assert_ok!(TemplateModule::add_collection_admin(1772 origin1.clone(),1773 collection_id,1774 account(2)1775 ));1776 assert_ok!(TemplateModule::add_collection_admin(1777 origin1,1778 collection_id,1779 account(3)1780 ));1781 });1782}17831784// Number of collection admins. Negotive test1785#[test]1786fn collection_admins_bound_neg() {1787 new_test_ext().execute_with(|| {1788 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17891790 let origin1 = Origin::signed(1);17911792 for i in 0..COLLECTION_ADMINS_LIMIT {1793 assert_ok!(TemplateModule::add_collection_admin(1794 origin1.clone(),1795 collection_id,1796 account(2 + i)1797 ));1798 }1799 assert_noop!(1800 TemplateModule::add_collection_admin(1801 origin1,1802 collection_id,1803 account(3 + COLLECTION_ADMINS_LIMIT)1804 ),1805 Error::<Test>::CollectionAdminsLimitExceeded1806 );1807 });1808}1809// #endregion18101811#[test]1812fn set_const_on_chain_schema() {1813 new_test_ext().execute_with(|| {1814 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18151816 let origin1 = Origin::signed(1);1817 assert_ok!(TemplateModule::set_const_on_chain_schema(1818 origin1,1819 collection_id,1820 b"test const on chain schema".to_vec()1821 ));18221823 assert_eq!(1824 TemplateModule::collection_id(collection_id)1825 .unwrap()1826 .const_on_chain_schema,1827 b"test const on chain schema".to_vec()1828 );1829 assert_eq!(1830 TemplateModule::collection_id(collection_id)1831 .unwrap()1832 .variable_on_chain_schema,1833 b"".to_vec()1834 );1835 });1836}18371838#[test]1839fn set_variable_on_chain_schema() {1840 new_test_ext().execute_with(|| {1841 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18421843 let origin1 = Origin::signed(1);1844 assert_ok!(TemplateModule::set_variable_on_chain_schema(1845 origin1,1846 collection_id,1847 b"test variable on chain schema".to_vec()1848 ));18491850 assert_eq!(1851 TemplateModule::collection_id(collection_id)1852 .unwrap()1853 .const_on_chain_schema,1854 b"".to_vec()1855 );1856 assert_eq!(1857 TemplateModule::collection_id(collection_id)1858 .unwrap()1859 .variable_on_chain_schema,1860 b"test variable on chain schema".to_vec()1861 );1862 });1863}18641865#[test]1866fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1867 new_test_ext().execute_with(|| {1868 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18691870 let origin1 = Origin::signed(1);18711872 let data = default_nft_data();1873 create_test_item(1, &data.into());18741875 let variable_data = b"test data".to_vec();1876 assert_ok!(TemplateModule::set_variable_meta_data(1877 origin1,1878 collection_id,1879 1,1880 variable_data.clone()1881 ));18821883 assert_eq!(1884 TemplateModule::nft_item_id(collection_id, 1)1885 .unwrap()1886 .variable_data,1887 variable_data1888 );1889 });1890}18911892#[test]1893fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1894 new_test_ext().execute_with(|| {1895 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);18961897 let origin1 = Origin::signed(1);18981899 let data = default_re_fungible_data();1900 create_test_item(1, &data.into());19011902 let variable_data = b"test data".to_vec();1903 assert_ok!(TemplateModule::set_variable_meta_data(1904 origin1,1905 collection_id,1906 1,1907 variable_data.clone()1908 ));19091910 assert_eq!(1911 TemplateModule::refungible_item_id(collection_id, 1)1912 .unwrap()1913 .variable_data,1914 variable_data1915 );1916 });1917}19181919#[test]1920fn set_variable_meta_data_on_fungible_token_fails() {1921 new_test_ext().execute_with(|| {1922 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);19231924 let origin1 = Origin::signed(1);19251926 let data = default_fungible_data();1927 create_test_item(1, &data.into());19281929 let variable_data = b"test data".to_vec();1930 assert_noop!(1931 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),1932 Error::<Test>::CantStoreMetadataInFungibleTokens1933 );1934 });1935}19361937#[test]1938fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1939 new_test_ext().execute_with(|| {1940 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19411942 let origin1 = Origin::signed(1);19431944 let data = default_nft_data();1945 create_test_item(1, &data.into());19461947 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1948 assert_noop!(1949 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),1950 Error::<Test>::TokenVariableDataLimitExceeded1951 );1952 });1953}19541955#[test]1956fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1957 new_test_ext().execute_with(|| {1958 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);19591960 let origin1 = Origin::signed(1);19611962 let data = default_re_fungible_data();1963 create_test_item(1, &data.into());19641965 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1966 assert_noop!(1967 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),1968 Error::<Test>::TokenVariableDataLimitExceeded1969 );1970 });1971}19721973#[test]1974fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {1975 new_test_ext().execute_with(|| {1976 //default_limits();19771978 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19791980 let origin1 = Origin::signed(1);19811982 let data = default_nft_data();1983 create_test_item(1, &data.into());19841985 assert_ok!(TemplateModule::set_meta_update_permission_flag(1986 origin1.clone(),1987 collection_id,1988 MetaUpdatePermission::ItemOwner,1989 ));19901991 let variable_data = b"ten chars.".to_vec();1992 assert_ok!(TemplateModule::set_variable_meta_data(1993 origin1,1994 collection_id,1995 1,1996 variable_data.clone()1997 ));19981999 assert_eq!(2000 TemplateModule::nft_item_id(collection_id, 1)2001 .unwrap()2002 .variable_data,2003 variable_data2004 );2005 });2006}20072008#[test]2009fn set_variable_meta_data_on_nft_with_item_owner_permission_flag_neg() {2010 new_test_ext().execute_with(|| {2011 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);20122013 let origin1 = Origin::signed(1);20142015 assert_ok!(TemplateModule::set_mint_permission(2016 origin1.clone(),2017 collection_id,2018 true2019 ));2020 assert_ok!(TemplateModule::add_to_allow_list(2021 origin1.clone(),2022 collection_id,2023 account(1)2024 ));20252026 let data = default_nft_data();2027 create_test_item(1, &data.into());20282029 assert_ok!(TemplateModule::set_meta_update_permission_flag(2030 origin1.clone(),2031 collection_id,2032 MetaUpdatePermission::ItemOwner,2033 ));20342035 let variable_data = b"1234567890123".to_vec();2036 assert_noop!(2037 TemplateModule::set_variable_meta_data(2038 origin1,2039 collection_id,2040 1,2041 variable_data.clone()2042 ),2043 Error::<Test>::TokenVariableDataLimitExceeded2044 );2045 })2046}20472048#[test]2049fn collection_transfer_flag_works() {2050 new_test_ext().execute_with(|| {2051 let origin1 = Origin::signed(1);20522053 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2054 assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, 1, true));20552056 let data = default_nft_data();2057 create_test_item(collection_id, &data.into());2058 assert_eq!(TemplateModule::balance_count(1, 1), 1);2059 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);20602061 let origin1 = Origin::signed(1);20622063 // default scenario2064 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1000));2065 assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(2));2066 assert_eq!(TemplateModule::balance_count(1, 1), 0);2067 assert_eq!(TemplateModule::balance_count(1, 2), 1);20682069 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);2070 });2071}20722073#[test]2074fn set_variable_meta_data_on_nft_with_admin_flag() {2075 new_test_ext().execute_with(|| {2076 // default_limits();20772078 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, 1);20792080 let origin1 = Origin::signed(1);2081 let origin2 = Origin::signed(2);20822083 assert_ok!(TemplateModule::set_mint_permission(2084 origin2.clone(),2085 collection_id,2086 true2087 ));2088 assert_ok!(TemplateModule::add_to_allow_list(2089 origin2.clone(),2090 collection_id,2091 account(1)2092 ));20932094 assert_ok!(TemplateModule::add_collection_admin(2095 origin2.clone(),2096 collection_id,2097 account(1)2098 ));20992100 let data = default_nft_data();2101 create_test_item(1, &data.into());21022103 assert_ok!(TemplateModule::set_meta_update_permission_flag(2104 origin2.clone(),2105 collection_id,2106 MetaUpdatePermission::Admin,2107 ));21082109 let variable_data = b"test.".to_vec();2110 assert_ok!(TemplateModule::set_variable_meta_data(2111 origin1,2112 collection_id,2113 1,2114 variable_data.clone()2115 ));21162117 assert_eq!(2118 TemplateModule::nft_item_id(collection_id, 1)2119 .unwrap()2120 .variable_data,2121 variable_data2122 );2123 });2124}21252126#[test]2127fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2128 new_test_ext().execute_with(|| {2129 // default_limits();21302131 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, 1);21322133 let origin1 = Origin::signed(1);2134 let origin2 = Origin::signed(2);21352136 assert_ok!(TemplateModule::set_mint_permission(2137 origin2.clone(),2138 collection_id,2139 true2140 ));2141 assert_ok!(TemplateModule::add_to_allow_list(2142 origin2.clone(),2143 collection_id,2144 account(1)2145 ));21462147 let data = default_nft_data();2148 create_test_item(1, &data.into());21492150 assert_ok!(TemplateModule::set_meta_update_permission_flag(2151 origin2.clone(),2152 collection_id,2153 MetaUpdatePermission::Admin,2154 ));21552156 let variable_data = b"test.".to_vec();2157 assert_noop!(2158 TemplateModule::set_variable_meta_data(2159 origin1,2160 collection_id,2161 1,2162 variable_data.clone()2163 ),2164 Error::<Test>::NoPermission2165 );2166 });2167}21682169#[test]2170fn set_variable_meta_flag_after_freeze() {2171 new_test_ext().execute_with(|| {2172 // default_limits();21732174 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, 1);21752176 let origin2 = Origin::signed(2);21772178 assert_ok!(TemplateModule::set_meta_update_permission_flag(2179 origin2.clone(),2180 collection_id,2181 MetaUpdatePermission::None,2182 ));2183 assert_noop!(2184 TemplateModule::set_meta_update_permission_flag(2185 origin2.clone(),2186 collection_id,2187 MetaUpdatePermission::Admin2188 ),2189 Error::<Test>::MetadataFlagFrozen2190 );2191 });2192}21932194#[test]2195fn set_variable_meta_data_on_nft_with_none_flag_neg() {2196 new_test_ext().execute_with(|| {2197 // default_limits();21982199 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);2200 let origin1 = Origin::signed(1);22012202 let data = default_nft_data();2203 create_test_item(1, &data.into());22042205 assert_ok!(TemplateModule::set_meta_update_permission_flag(2206 origin1.clone(),2207 collection_id,2208 MetaUpdatePermission::None,2209 ));22102211 let variable_data = b"test.".to_vec();2212 assert_noop!(2213 TemplateModule::set_variable_meta_data(2214 origin1.clone(),2215 collection_id,2216 1,2217 variable_data.clone()2218 ),2219 Error::<Test>::MetadataUpdateDenied2220 );2221 });2222}22232224#[test]2225fn collection_transfer_flag_works_neg() {2226 new_test_ext().execute_with(|| {2227 let origin1 = Origin::signed(1);22282229 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2230 assert_ok!(TemplateModule::set_transfers_enabled_flag(2231 origin1, 1, false2232 ));22332234 let data = default_nft_data();2235 create_test_item(collection_id, &data.into());2236 assert_eq!(TemplateModule::balance_count(1, 1), 1);2237 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);22382239 let origin1 = Origin::signed(1);22402241 // default scenario2242 assert_noop!(2243 TemplateModule::transfer(origin1, account(2), 1, 1, 1000),2244 Error::<Test>::TransferNotAllowed2245 );2246 assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(1));2247 assert_eq!(TemplateModule::balance_count(1, 1), 1);2248 assert_eq!(TemplateModule::balance_count(1, 2), 0);22492250 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);2251 });2252}1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode};5use nft_data_structs::{6 COLLECTION_NUMBER_LIMIT, Collection, CollectionId, CreateItemData, CreateFungibleData, 7 CreateNftData, CreateReFungibleData, ExistenceRequirement, MAX_COLLECTION_DESCRIPTION_LENGTH, 8 MAX_COLLECTION_NAME_LENGTH, MAX_DECIMAL_POINTS, MAX_TOKEN_PREFIX_LENGTH, COLLECTION_ADMINS_LIMIT, 9 MetaUpdatePermission, Pays, PostDispatchInfo, TokenId, Weight, WithdrawReasons,10};1112use frame_support::{assert_noop, assert_ok};13use sp_std::convert::TryInto;1415fn default_nft_data() -> CreateNftData {16 CreateNftData {17 const_data: vec![1, 2, 3].try_into().unwrap(),18 variable_data: vec![3, 2, 1].try_into().unwrap(),19 }20}2122fn default_fungible_data() -> CreateFungibleData {23 CreateFungibleData { value: 5 }24}2526fn default_re_fungible_data() -> CreateReFungibleData {27 CreateReFungibleData {28 const_data: vec![1, 2, 3].try_into().unwrap(),29 variable_data: vec![3, 2, 1].try_into().unwrap(),30 pieces: 1023,31 }32}3334fn create_test_collection_for_owner(35 mode: &CollectionMode,36 owner: u64,37 id: CollectionId,38) -> CollectionId {39 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();40 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();41 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4243 let origin1 = Origin::signed(owner);44 assert_ok!(TemplateModule::create_collection(45 origin1,46 col_name1,47 col_desc1,48 token_prefix1,49 mode.clone()50 ));5152 let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();53 let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();54 let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();55 assert_eq!(<pallet_common::CollectionById<Test>>::get(id).unwrap().owner, owner);56 assert_eq!(57 <pallet_common::CollectionById<Test>>::get(id).unwrap().name,58 saved_col_name59 );60 assert_eq!(<pallet_common::CollectionById<Test>>::get(id).unwrap().mode, *mode);61 assert_eq!(62 <pallet_common::CollectionById<Test>>::get(id).unwrap().description,63 saved_description64 );65 assert_eq!(66 <pallet_common::CollectionById<Test>>::get(id).unwrap().token_prefix,67 saved_prefix68 );69 id70}7172fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {73 create_test_collection_for_owner(&mode, 1, id)74}7576fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {77 let origin1 = Origin::signed(1);78 assert_ok!(TemplateModule::create_item(79 origin1,80 collection_id,81 account(1),82 data.clone()83 ));84}8586fn account(sub: u64) -> TestCrossAccountId {87 TestCrossAccountId::from_sub(sub)88}8990// Use cases tests region91// #region9293#[test]94fn set_version_schema() {95 new_test_ext().execute_with(|| {96 let origin1 = Origin::signed(1);97 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));9899 assert_ok!(TemplateModule::set_schema_version(100 origin1,101 collection_id,102 SchemaVersion::Unique103 ));104 assert_eq!(105 <pallet_common::CollectionById<Test>>::get(collection_id)106 .unwrap()107 .schema_version,108 SchemaVersion::Unique109 );110 });111}112113#[test]114fn create_fungible_collection_fails_with_large_decimal_numbers() {115 new_test_ext().execute_with(|| {116 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();117 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();118 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();119120 let origin1 = Origin::signed(1);121 assert_noop!(122 TemplateModule::create_collection(123 origin1,124 col_name1,125 col_desc1,126 token_prefix1,127 CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)128 ),129 Error::<Test>::CollectionDecimalPointLimitExceeded130 );131 });132}133134#[test]135fn create_nft_item() {136 new_test_ext().execute_with(|| {137 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));138139 let data = default_nft_data();140 create_test_item(collection_id, &data.clone().into());141142 let item = <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1)).unwrap();143 assert_eq!(item.const_data, data.const_data.into_inner());144 assert_eq!(item.variable_data, data.variable_data.into_inner());145 });146}147148// Use cases tests region149// #region150#[test]151fn create_nft_multiple_items() {152 new_test_ext().execute_with(|| {153 create_test_collection(&CollectionMode::NFT, CollectionId(1));154155 let origin1 = Origin::signed(1);156157 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];158159 assert_ok!(TemplateModule::create_multiple_items(160 origin1,161 CollectionId(1),162 account(1),163 items_data164 .clone()165 .into_iter()166 .map(|d| { d.into() })167 .collect()168 ));169 for (index, data) in items_data.into_iter().enumerate() {170 let item = <pallet_nonfungible::TokenData<Test>>::get((CollectionId(1), TokenId((index + 1) as u32))).unwrap();171 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());172 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());173 }174 });175}176177#[test]178fn create_refungible_item() {179 new_test_ext().execute_with(|| {180 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));181182 let data = default_re_fungible_data();183 create_test_item(collection_id, &data.clone().into());184 let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));185 let balance = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));186 assert_eq!(item.const_data, data.const_data.into_inner());187 assert_eq!(item.variable_data, data.variable_data.into_inner());188 assert_eq!(balance, 1023);189 });190}191192#[test]193fn create_multiple_refungible_items() {194 new_test_ext().execute_with(|| {195 create_test_collection(&CollectionMode::ReFungible, CollectionId(1));196197 let origin1 = Origin::signed(1);198199 let items_data = vec![200 default_re_fungible_data(),201 default_re_fungible_data(),202 default_re_fungible_data(),203 ];204205 assert_ok!(TemplateModule::create_multiple_items(206 origin1,207 CollectionId(1),208 account(1),209 items_data210 .clone()211 .into_iter()212 .map(|d| { d.into() })213 .collect()214 ));215 for (index, data) in items_data.into_iter().enumerate() {216 let item = <pallet_nonfungible::TokenData<Test>>::get((CollectionId(1), TokenId((index + 1) as u32))).unwrap();217 let balance = <pallet_refungible::Balance<Test>>::get((CollectionId(1), TokenId(1), account(1)));218 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());219 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());220 assert_eq!(balance, 1023);221 }222 });223}224225#[test]226fn create_fungible_item() {227 new_test_ext().execute_with(|| {228 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));229230 let data = default_fungible_data();231 create_test_item(collection_id, &data.into());232233 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);234 });235}236237//#[test]238// fn create_multiple_fungible_items() {239// new_test_ext().execute_with(|| {240// default_limits();241242// create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));243244// let origin1 = Origin::signed(1);245246// let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];247248// assert_ok!(TemplateModule::create_multiple_items(249// origin1.clone(),250// 1,251// 1,252// items_data.clone().into_iter().map(|d| { d.into() }).collect()253// ));254255// for (index, _) in items_data.iter().enumerate() {256// assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);257// }258// assert_eq!(TemplateModule::balance_count(1, 1), 3000);259// assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);260// });261// }262263#[test]264fn transfer_fungible_item() {265 new_test_ext().execute_with(|| {266 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));267268 let origin1 = Origin::signed(1);269 let origin2 = Origin::signed(2);270271 let data = default_fungible_data();272 create_test_item(collection_id, &data.into());273274 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))), 5);275276 // change owner scenario277 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 5));278 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))), 0);279280 // split item scenario281 assert_ok!(TemplateModule::transfer(282 origin2.clone(),283 account(3),284 CollectionId(1),285 TokenId(1),286 3287 ));288289 // split item and new owner has account scenario290 assert_ok!(TemplateModule::transfer(origin2, account(3), CollectionId(1), TokenId(1), 1));291 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(2))), 1);292 assert_eq!(<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(3))), 4);293 });294}295296#[test]297fn transfer_refungible_item() {298 new_test_ext().execute_with(|| {299 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));300301 let data = default_re_fungible_data();302 create_test_item(collection_id, &data.clone().into());303304 let origin1 = Origin::signed(1);305 let origin2 = Origin::signed(2);306 {307 let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));308 let balance = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));309 assert_eq!(item.const_data, data.const_data.into_inner());310 assert_eq!(item.variable_data, data.variable_data.into_inner());311 assert_eq!(balance, 1023);312 }313 314 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1023);315 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);316317 // change owner scenario318 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1023));319320 let balance2 = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2)));321 assert_eq!(balance2, 1023);322 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);323 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 1023);324 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);325 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);326327 // split item scenario328 assert_ok!(TemplateModule::transfer(329 origin2.clone(),330 account(3),331 CollectionId(1),332 TokenId(1),333 500334 ));335 {336 let item = <pallet_refungible::TokenData<Test>>::get((CollectionId(1), TokenId(1)));337 let balance2 = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2)));338 let balance3 = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3)));339 assert_eq!(balance2, 523);340 assert_eq!(balance3, 500);341 }342 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 523);343 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 500);344 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);345 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))), true);346347 // split item and new owner has account scenario348 assert_ok!(TemplateModule::transfer(origin2, account(3), CollectionId(1), TokenId(1), 200));349 {350 let item = <pallet_refungible::TokenData<Test>>::get((CollectionId(1), TokenId(1)));351 let balance2 = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2)));352 let balance3 = <pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3)));353 assert_eq!(balance2, 323);354 assert_eq!(balance3, 700);355 }356 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))), 323);357 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 700);358 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);359 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))), true);360 });361}362363#[test]364fn transfer_nft_item() {365 new_test_ext().execute_with(|| {366 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));367368 let data = default_nft_data();369 create_test_item(collection_id, &data.into());370 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);371 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);372373374 let origin1 = Origin::signed(1);375 // default scenario376 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1000));377 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);378 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);379 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);380 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);381 });382}383384#[test]385fn nft_approve_and_transfer_from() {386 new_test_ext().execute_with(|| {387 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));388389 let data = default_nft_data();390 create_test_item(collection_id, &data.into());391392 let origin1 = Origin::signed(1);393 let origin2 = Origin::signed(2);394395 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);396 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);397398 // neg transfer399 assert_noop!(400 TemplateModule::transfer_from(origin2.clone(), account(1), account(2), CollectionId(1), TokenId(1), 1),401 CommonError::<Test>::NoPermission402 );403404 // do approve405 assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 5));406 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));407408 assert_ok!(TemplateModule::transfer_from(409 origin2,410 account(1),411 account(3),412 CollectionId(1),413 TokenId(1),414 1415 ));416 assert!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none());417 });418}419420#[test]421fn nft_approve_and_transfer_from_allow_list() {422 new_test_ext().execute_with(|| {423 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));424425 let origin1 = Origin::signed(1);426 let origin2 = Origin::signed(2);427428 let data = default_nft_data();429 create_test_item(collection_id, &data.clone().into());430431 assert_eq!(432 &<pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1))).unwrap().const_data,433 &data.const_data.into_inner()434 );435 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);436 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);437438 assert_ok!(TemplateModule::set_mint_permission(439 origin1.clone(),440 CollectionId(1),441 true442 ));443 assert_ok!(TemplateModule::set_public_access_mode(444 origin1.clone(),445 CollectionId(1),446 AccessMode::AllowList447 ));448 assert_ok!(TemplateModule::add_to_allow_list(449 origin1.clone(),450 CollectionId(1),451 account(1)452 ));453 assert_ok!(TemplateModule::add_to_allow_list(454 origin1.clone(),455 CollectionId(1),456 account(2)457 ));458 assert_ok!(TemplateModule::add_to_allow_list(459 origin1.clone(),460 CollectionId(1),461 account(3)462 ));463464 // do approve465 assert_ok!(TemplateModule::approve(466 origin1.clone(),467 account(2),468 CollectionId(1),469 TokenId(1),470 5471 ));472 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));473 assert_ok!(TemplateModule::approve(origin1, account(3), CollectionId(1), TokenId(1), 5));474 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(3));475476 assert_ok!(TemplateModule::transfer_from(477 origin2,478 account(1),479 account(3),480 CollectionId(1),481 TokenId(1),482 1483 ));484 assert!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none());485 });486}487488#[test]489fn refungible_approve_and_transfer_from() {490 new_test_ext().execute_with(|| {491 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));492493 let origin1 = Origin::signed(1);494 let origin2 = Origin::signed(2);495496 let data = default_re_fungible_data();497 create_test_item(collection_id, &data.into());498499 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1023);500 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);501502 assert_ok!(TemplateModule::set_mint_permission(503 origin1.clone(),504 CollectionId(1),505 true506 ));507 assert_ok!(TemplateModule::set_public_access_mode(508 origin1.clone(),509 CollectionId(1),510 AccessMode::AllowList511 ));512 assert_ok!(TemplateModule::add_to_allow_list(513 origin1.clone(),514 CollectionId(1),515 account(1)516 ));517 assert_ok!(TemplateModule::add_to_allow_list(518 origin1.clone(),519 CollectionId(1),520 account(2)521 ));522 assert_ok!(TemplateModule::add_to_allow_list(523 origin1.clone(),524 CollectionId(1),525 account(3)526 ));527528 // do approve529 assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1023));530 assert_eq!(<pallet_refungible::Allowance<Test>>::get((CollectionId(1), TokenId(1), account(1), account(2))), 1023);531532 assert_ok!(TemplateModule::transfer_from(533 origin2,534 account(1),535 account(3),536 CollectionId(1),537 TokenId(1),538 100539 ));540 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 923);541 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))), 100);542 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);543 assert_eq!(<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(3))), true);544 assert_eq!(<pallet_refungible::Allowance<Test>>::get((CollectionId(1), TokenId(1), account(1), account(2))), 923);545 });546}547548#[test]549fn fungible_approve_and_transfer_from() {550 new_test_ext().execute_with(|| {551 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));552553 let data = default_fungible_data();554 create_test_item(collection_id, &data.into());555556 let origin1 = Origin::signed(1);557 let origin2 = Origin::signed(2);558559 assert_ok!(TemplateModule::set_mint_permission(560 origin1.clone(),561 CollectionId(1),562 true563 ));564 assert_ok!(TemplateModule::set_public_access_mode(565 origin1.clone(),566 CollectionId(1),567 AccessMode::AllowList568 ));569 assert_ok!(TemplateModule::add_to_allow_list(570 origin1.clone(),571 CollectionId(1),572 account(1)573 ));574 assert_ok!(TemplateModule::add_to_allow_list(575 origin1.clone(),576 CollectionId(1),577 account(2)578 ));579 assert_ok!(TemplateModule::add_to_allow_list(580 origin1.clone(),581 CollectionId(1),582 account(3)583 ));584585 // do approve586 assert_ok!(TemplateModule::approve(587 origin1.clone(),588 account(2),589 CollectionId(1),590 TokenId(1),591 5592 ));593 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 5);594 assert_ok!(TemplateModule::approve(origin1, account(3), CollectionId(1), TokenId(1), 5));595 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 5);596 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(3))), 5);597598 assert_ok!(TemplateModule::transfer_from(599 origin2.clone(),600 account(1),601 account(3),602 CollectionId(1),603 TokenId(1),604 4605 ));606607 assert_eq!(<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))), 1);608609 assert_noop!(610 TemplateModule::transfer_from(origin2, account(1), account(3), CollectionId(1), TokenId(1), 4),611 CommonError::<Test>::NoPermission612 );613 });614}615616#[test]617fn change_collection_owner() {618 new_test_ext().execute_with(|| {619 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));620621 let origin1 = Origin::signed(1);622 assert_ok!(TemplateModule::change_collection_owner(623 origin1,624 collection_id,625 2626 ));627 assert_eq!(628 <pallet_common::CollectionById<Test>>::get(collection_id).unwrap().owner,629 2630 );631 });632}633634#[test]635fn destroy_collection() {636 new_test_ext().execute_with(|| {637 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));638639 let origin1 = Origin::signed(1);640 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));641 });642}643644#[test]645fn burn_nft_item() {646 new_test_ext().execute_with(|| {647 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));648649 let origin1 = Origin::signed(1);650 assert_ok!(TemplateModule::add_collection_admin(651 origin1.clone(),652 collection_id,653 account(2)654 ));655656 let data = default_nft_data();657 create_test_item(collection_id, &data.into());658659 // check balance (collection with id = 1, user id = 1)660 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);661662 // burn item663 assert_ok!(TemplateModule::burn_item(664 origin1.clone(),665 collection_id,666 TokenId(1),667 1668 ));669 assert_noop!(670 TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1),671 CommonError::<Test>::TokenNotFound672 );673674 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);675 });676}677678#[test]679fn burn_fungible_item() {680 new_test_ext().execute_with(|| {681 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));682683 let origin1 = Origin::signed(1);684 assert_ok!(TemplateModule::add_collection_admin(685 origin1.clone(),686 collection_id,687 account(2)688 ));689690 let data = default_fungible_data();691 create_test_item(collection_id, &data.into());692693 // check balance (collection with id = 1, user id = 1)694 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 5);695696 // burn item697 assert_ok!(TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 5));698 assert_noop!(699 TemplateModule::burn_item(origin1, CollectionId(1), TokenId(1), 5),700 CommonError::<Test>::TokenValueNotEnough701 );702703 assert_eq!(<pallet_fungible::Balance<Test>>::get((collection_id, account(1))), 0);704 });705}706707#[test]708fn burn_refungible_item() {709 new_test_ext().execute_with(|| {710 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));711 let origin1 = Origin::signed(1);712713 assert_ok!(TemplateModule::set_mint_permission(714 origin1.clone(),715 collection_id,716 true717 ));718 assert_ok!(TemplateModule::set_public_access_mode(719 origin1.clone(),720 collection_id,721 AccessMode::AllowList722 ));723 assert_ok!(TemplateModule::add_to_allow_list(724 origin1.clone(),725 collection_id,726 account(1)727 ));728729 assert_ok!(TemplateModule::add_collection_admin(730 origin1.clone(),731 collection_id,732 account(2)733 ));734735 let data = default_re_fungible_data();736 create_test_item(collection_id, &data.into());737738 // check balance (collection with id = 1, user id = 2)739 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))), 1023);740 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 1023);741742 // burn item743 assert_ok!(TemplateModule::burn_item(origin1.clone(), collection_id, TokenId(1), 1023));744 assert_noop!(745 TemplateModule::burn_item(origin1, collection_id, TokenId(1), 1023),746 CommonError::<Test>::TokenNotFound747 );748749 assert_eq!(<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))), 0);750 });751}752753#[test]754fn add_collection_admin() {755 new_test_ext().execute_with(|| {756 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));757 create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(2));758 create_test_collection_for_owner(&CollectionMode::NFT, 3, CollectionId(3));759760 let origin1 = Origin::signed(1);761762 // collection admin763 assert_ok!(TemplateModule::add_collection_admin(764 origin1.clone(),765 collection1_id,766 account(2)767 ));768 assert_ok!(TemplateModule::add_collection_admin(769 origin1,770 collection1_id,771 account(3)772 ));773774 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(1))));775 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));776 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));777 });778}779780#[test]781fn remove_collection_admin() {782 new_test_ext().execute_with(|| {783 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));784 create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(2));785 create_test_collection_for_owner(&CollectionMode::NFT, 3, CollectionId(3));786787 let origin1 = Origin::signed(1);788 let origin2 = Origin::signed(2);789790 // collection admin791 assert_ok!(TemplateModule::add_collection_admin(792 origin1.clone(),793 collection1_id,794 account(2)795 ));796 assert_ok!(TemplateModule::add_collection_admin(797 origin1,798 collection1_id,799 account(3)800 ));801802 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))));803 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));804805 // remove admin806 assert_ok!(TemplateModule::remove_collection_admin(807 origin2,808 CollectionId(1),809 account(3)810 ));811 assert!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))));812 assert_eq!(<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(2))), false);813 });814}815816#[test]817fn balance_of() {818 new_test_ext().execute_with(|| {819 let nft_collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));820 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(2));821 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(3));822823 // check balance before824 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))), 0);825 assert_eq!(<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))), 0);826 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))), 0);827828 let nft_data = default_nft_data();829 create_test_item(nft_collection_id, &nft_data.into());830831 let fungible_data = default_fungible_data();832 create_test_item(fungible_collection_id, &fungible_data.into());833834 let re_fungible_data = default_re_fungible_data();835 create_test_item(re_fungible_collection_id, &re_fungible_data.into());836837 // check balance (collection with id = 1, user id = 1)838 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))), 1);839 assert_eq!(<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))), 5);840 assert_eq!(<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))), 1023);841842 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))), true);843 assert_eq!(<pallet_refungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))), true);844 });845}846847#[test]848fn approve() {849 new_test_ext().execute_with(|| {850 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));851852 let data = default_nft_data();853 create_test_item(collection_id, &data.into());854855 let origin1 = Origin::signed(1);856857 // approve858 assert_ok!(TemplateModule::approve(origin1, account(2), CollectionId(1), TokenId(1), 1));859 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));860 });861}862863#[test]864fn transfer_from() {865 new_test_ext().execute_with(|| {866 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));867 let origin1 = Origin::signed(1);868 let origin2 = Origin::signed(2);869870 let data = default_nft_data();871 create_test_item(collection_id, &data.into());872873 // approve874 assert_ok!(TemplateModule::approve(875 origin1.clone(),876 account(2),877 CollectionId(1),878 TokenId(1),879 1880 ));881 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(2));882883 assert_ok!(TemplateModule::set_mint_permission(884 origin1.clone(),885 CollectionId(1),886 true887 ));888 assert_ok!(TemplateModule::set_public_access_mode(889 origin1.clone(),890 CollectionId(1),891 AccessMode::AllowList892 ));893 assert_ok!(TemplateModule::add_to_allow_list(894 origin1.clone(),895 CollectionId(1),896 account(1)897 ));898 assert_ok!(TemplateModule::add_to_allow_list(899 origin1.clone(),900 CollectionId(1),901 account(2)902 ));903 assert_ok!(TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(3)));904905 assert_ok!(TemplateModule::transfer_from(906 origin2,907 account(1),908 account(2),909 CollectionId(1),910 TokenId(1),911 1912 ));913914 // after transfer915 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(1))), 0);916 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(2))), 1);917 });918}919920// #endregion921922// Coverage tests region923// #region924925#[test]926fn owner_can_add_address_to_allow_list() {927 new_test_ext().execute_with(|| {928 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));929930 let origin1 = Origin::signed(1);931 assert_ok!(TemplateModule::add_to_allow_list(932 origin1,933 collection_id,934 account(2)935 ));936 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));937 });938}939940#[test]941fn admin_can_add_address_to_allow_list() {942 new_test_ext().execute_with(|| {943 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));944 let origin1 = Origin::signed(1);945 let origin2 = Origin::signed(2);946947 assert_ok!(TemplateModule::add_collection_admin(948 origin1,949 collection_id,950 account(2)951 ));952 assert_ok!(TemplateModule::add_to_allow_list(953 origin2,954 collection_id,955 account(3)956 ));957 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(3))));958 });959}960961#[test]962fn nonprivileged_user_cannot_add_address_to_allow_list() {963 new_test_ext().execute_with(|| {964 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));965966 let origin2 = Origin::signed(2);967 assert_noop!(968 TemplateModule::add_to_allow_list(origin2, collection_id, account(3)),969 CommonError::<Test>::NoPermission970 );971 });972}973974#[test]975fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {976 new_test_ext().execute_with(|| {977 let origin1 = Origin::signed(1);978979 assert_noop!(980 TemplateModule::add_to_allow_list(origin1, CollectionId(1), account(2)),981 CommonError::<Test>::CollectionNotFound982 );983 });984}985986#[test]987fn nobody_can_add_address_to_allow_list_of_deleted_collection() {988 new_test_ext().execute_with(|| {989 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));990991 let origin1 = Origin::signed(1);992 assert_ok!(TemplateModule::destroy_collection(993 origin1.clone(),994 collection_id995 ));996 assert_noop!(997 TemplateModule::add_to_allow_list(origin1, collection_id, account(2)),998 CommonError::<Test>::CollectionNotFound999 );1000 });1001}10021003// If address is already added to allow list, nothing happens1004#[test]1005fn address_is_already_added_to_allow_list() {1006 new_test_ext().execute_with(|| {1007 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1008 let origin1 = Origin::signed(1);10091010 assert_ok!(TemplateModule::add_to_allow_list(1011 origin1.clone(),1012 collection_id,1013 account(2)1014 ));1015 assert_ok!(TemplateModule::add_to_allow_list(1016 origin1,1017 collection_id,1018 account(2)1019 ));1020 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1021 });1022}10231024#[test]1025fn owner_can_remove_address_from_allow_list() {1026 new_test_ext().execute_with(|| {1027 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10281029 let origin1 = Origin::signed(1);1030 assert_ok!(TemplateModule::add_to_allow_list(1031 origin1.clone(),1032 collection_id,1033 account(2)1034 ));1035 assert_ok!(TemplateModule::remove_from_allow_list(1036 origin1,1037 collection_id,1038 account(2)1039 ));1040 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1041 });1042}10431044#[test]1045fn admin_can_remove_address_from_allow_list() {1046 new_test_ext().execute_with(|| {1047 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1048 let origin1 = Origin::signed(1);1049 let origin2 = Origin::signed(2);10501051 assert_ok!(TemplateModule::add_collection_admin(1052 origin1.clone(),1053 collection_id,1054 account(2)1055 ));10561057 assert_ok!(TemplateModule::add_to_allow_list(1058 origin1,1059 collection_id,1060 account(3)1061 ));1062 assert_ok!(TemplateModule::remove_from_allow_list(1063 origin2,1064 collection_id,1065 account(3)1066 ));1067 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(3))));1068 });1069}10701071#[test]1072fn nonprivileged_user_cannot_remove_address_from_allow_list() {1073 new_test_ext().execute_with(|| {1074 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1075 let origin1 = Origin::signed(1);1076 let origin2 = Origin::signed(2);10771078 assert_ok!(TemplateModule::add_to_allow_list(1079 origin1,1080 collection_id,1081 account(2)1082 ));1083 assert_noop!(1084 TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1085 CommonError::<Test>::NoPermission1086 );1087 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1088 });1089}10901091#[test]1092fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {1093 new_test_ext().execute_with(|| {1094 let origin1 = Origin::signed(1);10951096 assert_noop!(1097 TemplateModule::remove_from_allow_list(origin1, CollectionId(1), account(2)),1098 CommonError::<Test>::CollectionNotFound1099 );1100 });1101}11021103#[test]1104fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {1105 new_test_ext().execute_with(|| {1106 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1107 let origin1 = Origin::signed(1);1108 let origin2 = Origin::signed(2);11091110 assert_ok!(TemplateModule::add_to_allow_list(1111 origin1.clone(),1112 collection_id,1113 account(2)1114 ));1115 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));1116 assert_noop!(1117 TemplateModule::remove_from_allow_list(origin2, collection_id, account(2)),1118 CommonError::<Test>::CollectionNotFound1119 );1120 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1121 });1122}11231124// If address is already removed from allow list, nothing happens1125#[test]1126fn address_is_already_removed_from_allow_list() {1127 new_test_ext().execute_with(|| {1128 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1129 let origin1 = Origin::signed(1);11301131 assert_ok!(TemplateModule::add_to_allow_list(1132 origin1.clone(),1133 collection_id,1134 account(2)1135 ));1136 assert_ok!(TemplateModule::remove_from_allow_list(1137 origin1.clone(),1138 collection_id,1139 account(2)1140 ));1141 assert_ok!(TemplateModule::remove_from_allow_list(1142 origin1,1143 collection_id,1144 account(2)1145 ));1146 assert!(<pallet_common::Allowlist<Test>>::get((collection_id, account(2))));1147 });1148}11491150// If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom (2 tests)1151#[test]1152fn allow_list_test_1() {1153 new_test_ext().execute_with(|| {1154 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));11551156 let origin1 = Origin::signed(1);11571158 let data = default_nft_data();1159 create_test_item(collection_id, &data.into());11601161 assert_ok!(TemplateModule::set_public_access_mode(1162 origin1.clone(),1163 collection_id,1164 AccessMode::AllowList1165 ));1166 assert_ok!(TemplateModule::add_to_allow_list(1167 origin1.clone(),1168 collection_id,1169 account(2)1170 ));11711172 assert_noop!(1173 TemplateModule::transfer(origin1, account(3), CollectionId(1), TokenId(1), 1),1174 CommonError::<Test>::AddressNotInAllowlist1175 );1176 });1177}11781179#[test]1180fn allow_list_test_2() {1181 new_test_ext().execute_with(|| {1182 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1183 let origin1 = Origin::signed(1);11841185 let data = default_nft_data();1186 create_test_item(collection_id, &data.into());11871188 assert_ok!(TemplateModule::set_public_access_mode(1189 origin1.clone(),1190 collection_id,1191 AccessMode::AllowList1192 ));1193 assert_ok!(TemplateModule::add_to_allow_list(1194 origin1.clone(),1195 collection_id,1196 account(1)1197 ));1198 assert_ok!(TemplateModule::add_to_allow_list(1199 origin1.clone(),1200 collection_id,1201 account(2)1202 ));12031204 // do approve1205 assert_ok!(TemplateModule::approve(1206 origin1.clone(),1207 account(1),1208 collection_id,1209 TokenId(1),1210 11211 ));1212 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));12131214 assert_ok!(TemplateModule::remove_from_allow_list(1215 origin1.clone(),1216 collection_id,1217 account(1)1218 ));12191220 assert_noop!(1221 TemplateModule::transfer_from(origin1, account(1), account(3), CollectionId(1), TokenId(1), 1),1222 CommonError::<Test>::AddressNotInAllowlist1223 );1224 });1225}12261227// If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom (2 tests)1228#[test]1229fn allow_list_test_3() {1230 new_test_ext().execute_with(|| {1231 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));12321233 let origin1 = Origin::signed(1);12341235 let data = default_nft_data();1236 create_test_item(collection_id, &data.into());12371238 assert_ok!(TemplateModule::set_public_access_mode(1239 origin1.clone(),1240 collection_id,1241 AccessMode::AllowList1242 ));1243 assert_ok!(TemplateModule::add_to_allow_list(1244 origin1.clone(),1245 collection_id,1246 account(1)1247 ));12481249 assert_noop!(1250 TemplateModule::transfer(origin1, account(3), collection_id, TokenId(1), 1),1251 CommonError::<Test>::AddressNotInAllowlist1252 );1253 });1254}12551256#[test]1257fn allow_list_test_4() {1258 new_test_ext().execute_with(|| {1259 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));12601261 let origin1 = Origin::signed(1);12621263 let data = default_nft_data();1264 create_test_item(collection_id, &data.into());12651266 assert_ok!(TemplateModule::set_public_access_mode(1267 origin1.clone(),1268 collection_id,1269 AccessMode::AllowList1270 ));1271 assert_ok!(TemplateModule::add_to_allow_list(1272 origin1.clone(),1273 collection_id,1274 account(1)1275 ));1276 assert_ok!(TemplateModule::add_to_allow_list(1277 origin1.clone(),1278 collection_id,1279 account(2)1280 ));12811282 // do approve1283 assert_ok!(TemplateModule::approve(1284 origin1.clone(),1285 account(1),1286 collection_id,1287 TokenId(1),1288 11289 ));1290 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));12911292 assert_ok!(TemplateModule::remove_from_allow_list(1293 origin1.clone(),1294 collection_id,1295 account(2)1296 ));12971298 assert_noop!(1299 TemplateModule::transfer_from(origin1, account(1), account(3), collection_id, TokenId(1), 1),1300 CommonError::<Test>::AddressNotInAllowlist1301 );1302 });1303}13041305// If Public Access mode is set to AllowList, tokens can’t be destroyed by a non-allowlisted address (even if it owned them before enabling AllowList mode)1306#[test]1307fn allow_list_test_5() {1308 new_test_ext().execute_with(|| {1309 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13101311 let origin1 = Origin::signed(1);13121313 let data = default_nft_data();1314 create_test_item(collection_id, &data.into());13151316 assert_ok!(TemplateModule::set_public_access_mode(1317 origin1.clone(),1318 collection_id,1319 AccessMode::AllowList1320 ));1321 assert_noop!(1322 TemplateModule::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 5),1323 CommonError::<Test>::AddressNotInAllowlist1324 );1325 });1326}13271328// If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method).1329#[test]1330fn allow_list_test_6() {1331 new_test_ext().execute_with(|| {1332 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13331334 let origin1 = Origin::signed(1);13351336 let data = default_nft_data();1337 create_test_item(collection_id, &data.into());13381339 assert_ok!(TemplateModule::set_public_access_mode(1340 origin1.clone(),1341 collection_id,1342 AccessMode::AllowList1343 ));13441345 // do approve1346 assert_noop!(1347 TemplateModule::approve(origin1, account(1), CollectionId(1), TokenId(1), 5),1348 CommonError::<Test>::AddressNotInAllowlist1349 );1350 });1351}13521353// If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests) and1354// tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests)1355#[test]1356fn allow_list_test_7() {1357 new_test_ext().execute_with(|| {1358 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13591360 let data = default_nft_data();1361 create_test_item(collection_id, &data.into());13621363 let origin1 = Origin::signed(1);13641365 assert_ok!(TemplateModule::set_public_access_mode(1366 origin1.clone(),1367 collection_id,1368 AccessMode::AllowList1369 ));1370 assert_ok!(TemplateModule::add_to_allow_list(1371 origin1.clone(),1372 collection_id,1373 account(1)1374 ));1375 assert_ok!(TemplateModule::add_to_allow_list(1376 origin1.clone(),1377 collection_id,1378 account(2)1379 ));13801381 assert_ok!(TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1));1382 });1383}13841385#[test]1386fn allow_list_test_8() {1387 new_test_ext().execute_with(|| {1388 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13891390 let data = default_nft_data();1391 create_test_item(collection_id, &data.into());13921393 let origin1 = Origin::signed(1);13941395 assert_ok!(TemplateModule::set_public_access_mode(1396 origin1.clone(),1397 collection_id,1398 AccessMode::AllowList1399 ));1400 assert_ok!(TemplateModule::add_to_allow_list(1401 origin1.clone(),1402 collection_id,1403 account(1)1404 ));1405 assert_ok!(TemplateModule::add_to_allow_list(1406 origin1.clone(),1407 collection_id,1408 account(2)1409 ));14101411 // do approve1412 assert_ok!(TemplateModule::approve(1413 origin1.clone(),1414 account(1),1415 CollectionId(1), 1416 TokenId(1),1417 51418 ));1419 assert_eq!(<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(), account(1));14201421 assert_ok!(TemplateModule::transfer_from(1422 origin1,1423 account(1),1424 account(2),1425 CollectionId(1), 1426 TokenId(1),1427 11428 ));1429 });1430}14311432// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner.1433#[test]1434fn allow_list_test_9() {1435 new_test_ext().execute_with(|| {1436 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1437 let origin1 = Origin::signed(1);14381439 assert_ok!(TemplateModule::set_public_access_mode(1440 origin1.clone(),1441 collection_id,1442 AccessMode::AllowList1443 ));1444 assert_ok!(TemplateModule::set_mint_permission(1445 origin1,1446 collection_id,1447 false1448 ));14491450 let data = default_nft_data();1451 create_test_item(collection_id, &data.into());1452 });1453}14541455// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin.1456#[test]1457fn allow_list_test_10() {1458 new_test_ext().execute_with(|| {1459 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14601461 let origin1 = Origin::signed(1);1462 let origin2 = Origin::signed(2);14631464 assert_ok!(TemplateModule::set_public_access_mode(1465 origin1.clone(),1466 collection_id,1467 AccessMode::AllowList1468 ));1469 assert_ok!(TemplateModule::set_mint_permission(1470 origin1.clone(),1471 collection_id,1472 false1473 ));14741475 assert_ok!(TemplateModule::add_collection_admin(1476 origin1,1477 collection_id,1478 account(2)1479 ));14801481 assert_ok!(TemplateModule::create_item(1482 origin2,1483 collection_id,1484 account(2),1485 default_nft_data().into()1486 ));1487 });1488}14891490// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and allow listed address.1491#[test]1492fn allow_list_test_11() {1493 new_test_ext().execute_with(|| {1494 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14951496 let origin1 = Origin::signed(1);1497 let origin2 = Origin::signed(2);14981499 assert_ok!(TemplateModule::set_public_access_mode(1500 origin1.clone(),1501 collection_id,1502 AccessMode::AllowList1503 ));1504 assert_ok!(TemplateModule::set_mint_permission(1505 origin1.clone(),1506 collection_id,1507 false1508 ));1509 assert_ok!(TemplateModule::add_to_allow_list(1510 origin1,1511 collection_id,1512 account(2)1513 ));15141515 assert_noop!(1516 TemplateModule::create_item(origin2, CollectionId(1), account(2), default_nft_data().into()),1517 CommonError::<Test>::PublicMintingNotAllowed1518 );1519 });1520}15211522// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-allow listed address.1523#[test]1524fn allow_list_test_12() {1525 new_test_ext().execute_with(|| {1526 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15271528 let origin1 = Origin::signed(1);1529 let origin2 = Origin::signed(2);15301531 assert_ok!(TemplateModule::set_public_access_mode(1532 origin1.clone(),1533 collection_id,1534 AccessMode::AllowList1535 ));1536 assert_ok!(TemplateModule::set_mint_permission(1537 origin1,1538 collection_id,1539 false1540 ));15411542 assert_noop!(1543 TemplateModule::create_item(origin2, CollectionId(1), account(2), default_nft_data().into()),1544 CommonError::<Test>::PublicMintingNotAllowed1545 );1546 });1547}15481549// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner.1550#[test]1551fn allow_list_test_13() {1552 new_test_ext().execute_with(|| {1553 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15541555 let origin1 = Origin::signed(1);15561557 assert_ok!(TemplateModule::set_public_access_mode(1558 origin1.clone(),1559 collection_id,1560 AccessMode::AllowList1561 ));1562 assert_ok!(TemplateModule::set_mint_permission(1563 origin1,1564 collection_id,1565 true1566 ));15671568 let data = default_nft_data();1569 create_test_item(collection_id, &data.into());1570 });1571}15721573// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin.1574#[test]1575fn allow_list_test_14() {1576 new_test_ext().execute_with(|| {1577 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15781579 let origin1 = Origin::signed(1);1580 let origin2 = Origin::signed(2);15811582 assert_ok!(TemplateModule::set_public_access_mode(1583 origin1.clone(),1584 collection_id,1585 AccessMode::AllowList1586 ));1587 assert_ok!(TemplateModule::set_mint_permission(1588 origin1.clone(),1589 collection_id,1590 true1591 ));15921593 assert_ok!(TemplateModule::add_collection_admin(1594 origin1,1595 collection_id,1596 account(2)1597 ));15981599 assert_ok!(TemplateModule::create_item(1600 origin2,1601 collection_id,1602 account(2),1603 default_nft_data().into()1604 ));1605 });1606}16071608// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-allow listed address.1609#[test]1610fn allow_list_test_15() {1611 new_test_ext().execute_with(|| {1612 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16131614 let origin1 = Origin::signed(1);1615 let origin2 = Origin::signed(2);16161617 assert_ok!(TemplateModule::set_public_access_mode(1618 origin1.clone(),1619 collection_id,1620 AccessMode::AllowList1621 ));1622 assert_ok!(TemplateModule::set_mint_permission(1623 origin1,1624 collection_id,1625 true1626 ));16271628 assert_noop!(1629 TemplateModule::create_item(origin2, collection_id, account(2), default_nft_data().into()),1630 CommonError::<Test>::AddressNotInAllowlist1631 );1632 });1633}16341635// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by non-privileged and allow listed address.1636#[test]1637fn allow_list_test_16() {1638 new_test_ext().execute_with(|| {1639 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));16401641 let origin1 = Origin::signed(1);1642 let origin2 = Origin::signed(2);16431644 assert_ok!(TemplateModule::set_public_access_mode(1645 origin1.clone(),1646 collection_id,1647 AccessMode::AllowList1648 ));1649 assert_ok!(TemplateModule::set_mint_permission(1650 origin1.clone(),1651 collection_id,1652 true1653 ));1654 assert_ok!(TemplateModule::add_to_allow_list(1655 origin1,1656 collection_id,1657 account(2)1658 ));16591660 assert_ok!(TemplateModule::create_item(1661 origin2,1662 collection_id,1663 account(2),1664 default_nft_data().into()1665 ));1666 });1667}16681669// Total number of collections. Positive test1670#[test]1671fn total_number_collections_bound() {1672 new_test_ext().execute_with(|| {1673 create_test_collection(&CollectionMode::NFT, CollectionId(1));1674 });1675}16761677// Total number of collections. Negotive test1678#[test]1679fn total_number_collections_bound_neg() {1680 new_test_ext().execute_with(|| {1681 let origin1 = Origin::signed(1);16821683 for i in 0..COLLECTION_NUMBER_LIMIT {1684 create_test_collection(&CollectionMode::NFT, CollectionId(i + 1));1685 }16861687 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1688 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1689 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();16901691 // 11-th collection in chain. Expects error1692 assert_noop!(1693 TemplateModule::create_collection(1694 origin1,1695 col_name1,1696 col_desc1,1697 token_prefix1,1698 CollectionMode::NFT1699 ),1700 CommonError::<Test>::TotalCollectionsLimitExceeded1701 );1702 });1703}17041705// Owned tokens by a single address. Positive test1706#[test]1707fn owned_tokens_bound() {1708 new_test_ext().execute_with(|| {1709 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17101711 let data = default_nft_data();1712 create_test_item(collection_id, &data.clone().into());1713 create_test_item(collection_id, &data.into());1714 });1715}17161717// Owned tokens by a single address. Negotive test1718#[test]1719fn owned_tokens_bound_neg() {1720 new_test_ext().execute_with(|| {1721 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17221723 let origin1 = Origin::signed(1);17241725 for _ in 0..MAX_TOKEN_OWNERSHIP {1726 let data = default_nft_data();1727 create_test_item(collection_id, &data.clone().into());1728 }17291730 let data = default_nft_data();1731 assert_noop!(1732 TemplateModule::create_item(origin1, CollectionId(1), account(1), data.into()),1733 CommonError::<Test>::AccountTokenLimitExceeded1734 );1735 });1736}17371738// Number of collection admins. Positive test1739#[test]1740fn collection_admins_bound() {1741 new_test_ext().execute_with(|| {1742 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17431744 let origin1 = Origin::signed(1);17451746 assert_ok!(TemplateModule::add_collection_admin(1747 origin1.clone(),1748 collection_id,1749 account(2)1750 ));1751 assert_ok!(TemplateModule::add_collection_admin(1752 origin1,1753 collection_id,1754 account(3)1755 ));1756 });1757}17581759// Number of collection admins. Negotive test1760#[test]1761fn collection_admins_bound_neg() {1762 new_test_ext().execute_with(|| {1763 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17641765 let origin1 = Origin::signed(1);17661767 for i in 0..COLLECTION_ADMINS_LIMIT {1768 assert_ok!(TemplateModule::add_collection_admin(1769 origin1.clone(),1770 collection_id,1771 account((2 + i).into())1772 ));1773 }1774 assert_noop!(1775 TemplateModule::add_collection_admin(1776 origin1,1777 collection_id,1778 account((3 + COLLECTION_ADMINS_LIMIT).into())1779 ),1780 CommonError::<Test>::CollectionAdminCountExceeded1781 );1782 });1783}1784// #endregion17851786#[test]1787fn set_const_on_chain_schema() {1788 new_test_ext().execute_with(|| {1789 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17901791 let origin1 = Origin::signed(1);1792 assert_ok!(TemplateModule::set_const_on_chain_schema(1793 origin1,1794 collection_id,1795 b"test const on chain schema".to_vec()1796 ));17971798 assert_eq!(1799 <pallet_common::CollectionById<Test>>::get(collection_id)1800 .unwrap()1801 .const_on_chain_schema,1802 b"test const on chain schema".to_vec()1803 );1804 assert_eq!(1805 <pallet_common::CollectionById<Test>>::get(collection_id)1806 .unwrap()1807 .variable_on_chain_schema,1808 b"".to_vec()1809 );1810 });1811}18121813#[test]1814fn set_variable_on_chain_schema() {1815 new_test_ext().execute_with(|| {1816 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18171818 let origin1 = Origin::signed(1);1819 assert_ok!(TemplateModule::set_variable_on_chain_schema(1820 origin1,1821 collection_id,1822 b"test variable on chain schema".to_vec()1823 ));18241825 assert_eq!(1826 <pallet_common::CollectionById<Test>>::get(collection_id)1827 .unwrap()1828 .const_on_chain_schema,1829 b"".to_vec()1830 );1831 assert_eq!(1832 <pallet_common::CollectionById<Test>>::get(collection_id)1833 .unwrap()1834 .variable_on_chain_schema,1835 b"test variable on chain schema".to_vec()1836 );1837 });1838}18391840#[test]1841fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1842 new_test_ext().execute_with(|| {1843 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18441845 let origin1 = Origin::signed(1);18461847 let data = default_nft_data();1848 create_test_item(CollectionId(1), &data.into());18491850 let variable_data = b"test data".to_vec();1851 assert_ok!(TemplateModule::set_variable_meta_data(1852 origin1,1853 collection_id,1854 TokenId(1),1855 variable_data.clone()1856 ));18571858 assert_eq!(1859 <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))1860 .unwrap()1861 .variable_data,1862 variable_data1863 );1864 });1865}18661867#[test]1868fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1869 new_test_ext().execute_with(|| {1870 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));18711872 let origin1 = Origin::signed(1);18731874 let data = default_re_fungible_data();1875 create_test_item(collection_id, &data.into());18761877 let variable_data = b"test data".to_vec();1878 assert_ok!(TemplateModule::set_variable_meta_data(1879 origin1,1880 collection_id,1881 TokenId(1),1882 variable_data.clone()1883 ));18841885 assert_eq!(1886 <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)))1887 .variable_data,1888 variable_data1889 );1890 });1891}18921893#[test]1894fn set_variable_meta_data_on_fungible_token_fails() {1895 new_test_ext().execute_with(|| {1896 let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));18971898 let origin1 = Origin::signed(1);18991900 let data = default_fungible_data();1901 create_test_item(collection_id, &data.into());19021903 let variable_data = b"test data".to_vec();1904 assert_noop!(1905 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data),1906 <pallet_fungible::Error<Test>>::FungibleItemsDontHaveData1907 );1908 });1909}19101911#[test]1912fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1913 new_test_ext().execute_with(|| {1914 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19151916 let origin1 = Origin::signed(1);19171918 let data = default_nft_data();1919 create_test_item(collection_id, &data.into());19201921 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1922 assert_noop!(1923 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data),1924 CommonError::<Test>::TokenVariableDataLimitExceeded1925 );1926 });1927}19281929#[test]1930fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1931 new_test_ext().execute_with(|| {1932 let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));19331934 let origin1 = Origin::signed(1);19351936 let data = default_re_fungible_data();1937 create_test_item(collection_id, &data.into());19381939 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1940 assert_noop!(1941 TemplateModule::set_variable_meta_data(origin1, collection_id, TokenId(1), variable_data),1942 CommonError::<Test>::TokenVariableDataLimitExceeded1943 );1944 });1945}19461947#[test]1948fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() {1949 new_test_ext().execute_with(|| {1950 //default_limits();19511952 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19531954 let origin1 = Origin::signed(1);19551956 let data = default_nft_data();1957 create_test_item(collection_id, &data.into());19581959 assert_ok!(TemplateModule::set_meta_update_permission_flag(1960 origin1.clone(),1961 collection_id,1962 MetaUpdatePermission::ItemOwner,1963 ));19641965 let variable_data = b"ten chars.".to_vec();1966 assert_ok!(TemplateModule::set_variable_meta_data(1967 origin1,1968 collection_id,1969 TokenId(1),1970 variable_data.clone()1971 ));19721973 assert_eq!(1974 <pallet_nonfungible::TokenData<Test>>::get((collection_id, TokenId(1)))1975 .unwrap()1976 .variable_data,1977 variable_data1978 );1979 });1980}19811982#[test]1983fn set_variable_meta_data_on_nft_with_item_owner_permission_flag_neg() {1984 new_test_ext().execute_with(|| {1985 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));19861987 let origin1 = Origin::signed(1);19881989 assert_ok!(TemplateModule::set_mint_permission(1990 origin1.clone(),1991 collection_id,1992 true1993 ));1994 assert_ok!(TemplateModule::add_to_allow_list(1995 origin1.clone(),1996 collection_id,1997 account(1)1998 ));19992000 let data = default_nft_data();2001 create_test_item(collection_id, &data.into());20022003 assert_ok!(TemplateModule::set_meta_update_permission_flag(2004 origin1.clone(),2005 collection_id,2006 MetaUpdatePermission::ItemOwner,2007 ));20082009 let variable_data = b"1234567890123".to_vec();2010 assert_noop!(2011 TemplateModule::set_variable_meta_data(2012 origin1,2013 collection_id,2014 TokenId(1),2015 variable_data.clone()2016 ),2017 CommonError::<Test>::TokenVariableDataLimitExceeded2018 );2019 })2020}20212022#[test]2023fn collection_transfer_flag_works() {2024 new_test_ext().execute_with(|| {2025 let origin1 = Origin::signed(1);20262027 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2028 assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, collection_id, true));20292030 let data = default_nft_data();2031 create_test_item(collection_id, &data.into());2032 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2033 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);20342035 let origin1 = Origin::signed(1);20362037 // default scenario2038 assert_ok!(TemplateModule::transfer(origin1, account(2), collection_id, TokenId(1), 1000));2039 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), false);2040 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), true);2041 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 0);2042 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 1);2043 });2044}20452046#[test]2047fn set_variable_meta_data_on_nft_with_admin_flag() {2048 new_test_ext().execute_with(|| {2049 // default_limits();20502051 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));20522053 let origin1 = Origin::signed(1);2054 let origin2 = Origin::signed(2);20552056 assert_ok!(TemplateModule::set_mint_permission(2057 origin2.clone(),2058 collection_id,2059 true2060 ));2061 assert_ok!(TemplateModule::add_to_allow_list(2062 origin2.clone(),2063 collection_id,2064 account(1)2065 ));20662067 assert_ok!(TemplateModule::add_collection_admin(2068 origin2.clone(),2069 collection_id,2070 account(1)2071 ));20722073 let data = default_nft_data();2074 create_test_item(collection_id, &data.into());20752076 assert_ok!(TemplateModule::set_meta_update_permission_flag(2077 origin2.clone(),2078 collection_id,2079 MetaUpdatePermission::Admin,2080 ));20812082 let variable_data = b"test.".to_vec();2083 assert_ok!(TemplateModule::set_variable_meta_data(2084 origin1,2085 collection_id,2086 TokenId(1),2087 variable_data.clone()2088 ));20892090 assert_eq!(2091 <pallet_nonfungible::TokenData<Test>>::get((collection_id, 1))2092 .unwrap()2093 .variable_data,2094 variable_data2095 );2096 });2097}20982099#[test]2100fn set_variable_meta_data_on_nft_with_admin_flag_neg() {2101 new_test_ext().execute_with(|| {2102 // default_limits();21032104 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));21052106 let origin1 = Origin::signed(1);2107 let origin2 = Origin::signed(2);21082109 assert_ok!(TemplateModule::set_mint_permission(2110 origin2.clone(),2111 collection_id,2112 true2113 ));2114 assert_ok!(TemplateModule::add_to_allow_list(2115 origin2.clone(),2116 collection_id,2117 account(1)2118 ));21192120 let data = default_nft_data();2121 create_test_item(collection_id, &data.into());21222123 assert_ok!(TemplateModule::set_meta_update_permission_flag(2124 origin2.clone(),2125 collection_id,2126 MetaUpdatePermission::Admin,2127 ));21282129 let variable_data = b"test.".to_vec();2130 assert_noop!(2131 TemplateModule::set_variable_meta_data(2132 origin1,2133 collection_id,2134 TokenId(1),2135 variable_data.clone()2136 ),2137 CommonError::<Test>::NoPermission2138 );2139 });2140}21412142#[test]2143fn set_variable_meta_flag_after_freeze() {2144 new_test_ext().execute_with(|| {2145 // default_limits();21462147 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1));21482149 let origin2 = Origin::signed(2);21502151 assert_ok!(TemplateModule::set_meta_update_permission_flag(2152 origin2.clone(),2153 collection_id,2154 MetaUpdatePermission::None,2155 ));2156 assert_noop!(2157 TemplateModule::set_meta_update_permission_flag(2158 origin2.clone(),2159 collection_id,2160 MetaUpdatePermission::Admin2161 ),2162 CommonError::<Test>::MetadataFlagFrozen2163 );2164 });2165}21662167#[test]2168fn set_variable_meta_data_on_nft_with_none_flag_neg() {2169 new_test_ext().execute_with(|| {2170 // default_limits();21712172 let collection_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));2173 let origin1 = Origin::signed(1);21742175 let data = default_nft_data();2176 create_test_item(collection_id, &data.into());21772178 assert_ok!(TemplateModule::set_meta_update_permission_flag(2179 origin1.clone(),2180 collection_id,2181 MetaUpdatePermission::None,2182 ));21832184 let variable_data = b"test.".to_vec();2185 assert_noop!(2186 TemplateModule::set_variable_meta_data(2187 origin1.clone(),2188 collection_id,2189 TokenId(1),2190 variable_data.clone()2191 ),2192 CommonError::<Test>::NoPermission2193 );2194 });2195}21962197#[test]2198fn collection_transfer_flag_works_neg() {2199 new_test_ext().execute_with(|| {2200 let origin1 = Origin::signed(1);22012202 let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2203 assert_ok!(TemplateModule::set_transfers_enabled_flag(2204 origin1, collection_id, false2205 ));22062207 let data = default_nft_data();2208 create_test_item(collection_id, &data.into());2209 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2210 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);22112212 let origin1 = Origin::signed(1);22132214 // default scenario2215 assert_noop!(2216 TemplateModule::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1000),2217 CommonError::<Test>::TransferNotAllowed2218 );2219 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))), 1);2220 assert_eq!(<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))), 0);2221 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))), true);2222 assert_eq!(<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))), false);2223 });2224}pallets/nonfungible/src/lib.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/lib.rs
+++ b/pallets/nonfungible/src/lib.rs
@@ -58,18 +58,18 @@
}
#[pallet::pallet]
- #[pallet::generate_store(pub(super) trait Store)]
+ #[pallet::generate_store(pub trait Store)]
pub struct Pallet<T>(_);
#[pallet::storage]
- pub(super) type TokensMinted<T: Config> =
+ pub type TokensMinted<T: Config> =
StorageMap<Hasher = Twox64Concat, Key = CollectionId, Value = u32, QueryKind = ValueQuery>;
#[pallet::storage]
- pub(super) type TokensBurnt<T: Config> =
+ pub type TokensBurnt<T: Config> =
StorageMap<Hasher = Twox64Concat, Key = CollectionId, Value = u32, QueryKind = ValueQuery>;
#[pallet::storage]
- pub(super) type TokenData<T: Config> = StorageNMap<
+ pub type TokenData<T: Config> = StorageNMap<
Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
Value = ItemData<T>,
QueryKind = OptionQuery,
@@ -77,7 +77,7 @@
/// Used to enumerate tokens owned by account
#[pallet::storage]
- pub(super) type Owned<T: Config> = StorageNMap<
+ pub type Owned<T: Config> = StorageNMap<
Key = (
Key<Twox64Concat, CollectionId>,
Key<Blake2_128Concat, T::CrossAccountId>,
@@ -88,7 +88,7 @@
>;
#[pallet::storage]
- pub(super) type AccountBalance<T: Config> = StorageNMap<
+ pub type AccountBalance<T: Config> = StorageNMap<
Key = (
Key<Twox64Concat, CollectionId>,
Key<Blake2_128Concat, T::CrossAccountId>,
@@ -98,7 +98,7 @@
>;
#[pallet::storage]
- pub(super) type Allowance<T: Config> = StorageNMap<
+ pub type Allowance<T: Config> = StorageNMap<
Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
Value = T::CrossAccountId,
QueryKind = OptionQuery,
pallets/refungible/src/lib.rsdiffbeforeafterboth--- a/pallets/refungible/src/lib.rs
+++ b/pallets/refungible/src/lib.rs
@@ -54,25 +54,25 @@
}
#[pallet::pallet]
- #[pallet::generate_store(pub(super) trait Store)]
+ #[pallet::generate_store(pub trait Store)]
pub struct Pallet<T>(_);
#[pallet::storage]
- pub(super) type TokensMinted<T: Config> =
+ pub type TokensMinted<T: Config> =
StorageMap<Hasher = Twox64Concat, Key = CollectionId, Value = u32, QueryKind = ValueQuery>;
#[pallet::storage]
- pub(super) type TokensBurnt<T: Config> =
+ pub type TokensBurnt<T: Config> =
StorageMap<Hasher = Twox64Concat, Key = CollectionId, Value = u32, QueryKind = ValueQuery>;
#[pallet::storage]
- pub(super) type TokenData<T: Config> = StorageNMap<
+ pub type TokenData<T: Config> = StorageNMap<
Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
Value = ItemData,
QueryKind = ValueQuery,
>;
#[pallet::storage]
- pub(super) type TotalSupply<T: Config> = StorageNMap<
+ pub type TotalSupply<T: Config> = StorageNMap<
Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
Value = u128,
QueryKind = ValueQuery,
@@ -80,7 +80,7 @@
/// Used to enumerate tokens owned by account
#[pallet::storage]
- pub(super) type Owned<T: Config> = StorageNMap<
+ pub type Owned<T: Config> = StorageNMap<
Key = (
Key<Twox64Concat, CollectionId>,
Key<Blake2_128Concat, T::CrossAccountId>,
@@ -91,7 +91,7 @@
>;
#[pallet::storage]
- pub(super) type AccountBalance<T: Config> = StorageNMap<
+ pub type AccountBalance<T: Config> = StorageNMap<
Key = (
Key<Twox64Concat, CollectionId>,
// Owner
@@ -102,7 +102,7 @@
>;
#[pallet::storage]
- pub(super) type Balance<T: Config> = StorageNMap<
+ pub type Balance<T: Config> = StorageNMap<
Key = (
Key<Twox64Concat, CollectionId>,
Key<Twox64Concat, TokenId>,
@@ -114,7 +114,7 @@
>;
#[pallet::storage]
- pub(super) type Allowance<T: Config> = StorageNMap<
+ pub type Allowance<T: Config> = StorageNMap<
Key = (
Key<Twox64Concat, CollectionId>,
Key<Twox64Concat, TokenId>,