difftreelog
CORE-36 Enable/Disable Transfers + Unit tests fix
in: master
8 files changed
Cargo.lockdiffbeforeafterboth--- a/Cargo.lock
+++ b/Cargo.lock
@@ -5850,34 +5850,34 @@
[[package]]
name = "pallet-scheduler"
version = "3.0.0"
+source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.7#9c572625f6557dfdb19f47474369a0327d51dfbc"
dependencies = [
"frame-benchmarking",
"frame-support",
"frame-system",
"log",
"parity-scale-codec 2.1.3",
- "serde",
- "sp-core",
"sp-io",
"sp-runtime",
"sp-std",
- "substrate-test-utils",
- "up-sponsorship",
]
[[package]]
name = "pallet-scheduler"
version = "3.0.0"
-source = "git+https://github.com/paritytech/substrate.git?branch=polkadot-v0.9.7#9c572625f6557dfdb19f47474369a0327d51dfbc"
dependencies = [
"frame-benchmarking",
"frame-support",
"frame-system",
"log",
"parity-scale-codec 2.1.3",
+ "serde",
+ "sp-core",
"sp-io",
"sp-runtime",
"sp-std",
+ "substrate-test-utils",
+ "up-sponsorship",
]
[[package]]
node/cli/src/chain_spec.rsdiffbeforeafterboth--- a/node/cli/src/chain_spec.rs
+++ b/node/cli/src/chain_spec.rs
@@ -196,6 +196,7 @@
const_on_chain_schema: vec![],
variable_on_chain_schema: vec![],
limits: CollectionLimits::default(),
+ transfers_enabled: true,
},
)],
nft_item_id: vec![],
pallets/inflation/src/tests.rsdiffbeforeafterboth--- a/pallets/inflation/src/tests.rs
+++ b/pallets/inflation/src/tests.rs
@@ -31,6 +31,8 @@
type ExistentialDeposit = ExistentialDeposit;
type WeightInfo = ();
type MaxLocks = MaxLocks;
+ type MaxReserves = ();
+ type ReserveIdentifier = ();
}
frame_support::construct_runtime!(
pallets/nft/src/lib.rsdiffbeforeafterboth--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -175,6 +175,8 @@
BadCreateRefungibleCall,
/// Gas limit exceeded
OutOfGas,
+ /// Collection settings not allowing items transferring
+ TransferNotAllowed,
}
}
@@ -533,6 +535,7 @@
variable_on_chain_schema: Vec::new(),
const_on_chain_schema: Vec::new(),
limits,
+ transfers_enabled: true,
};
// Add new collection to map
@@ -922,6 +925,34 @@
Ok(())
}
+ // TODO! transaction weight
+
+ /// Set transfers_enabled value for particular collection
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner.
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id: ID of the collection.
+ ///
+ /// * value: New flag value.
+ #[weight = <T as Config>::WeightInfo::burn_item()]
+ #[transactional]
+ pub fn set_transfers_enabled_flag(origin, collection_id: CollectionId, value: bool) -> DispatchResult {
+
+ let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
+ let mut target_collection = Self::get_collection(collection_id)?;
+
+ Self::check_owner_permissions(&target_collection, sender.as_sub())?;
+
+ target_collection.transfers_enabled = value;
+ Self::save_collection(target_collection);
+
+ Ok(())
+ }
+
/// Destroys a concrete instance of NFT.
///
/// # Permissions
@@ -1575,6 +1606,12 @@
Error::<T>::AccountTokenLimitExceeded
);
+ // preliminary transfer check
+ ensure!(
+ collection.transfers_enabled,
+ Error::<T>::TransferNotAllowed
+ );
+
Ok(())
}
pallets/nft/src/mock.rsdiffbeforeafterboth--- a/pallets/nft/src/mock.rs
+++ b/pallets/nft/src/mock.rs
@@ -74,6 +74,8 @@
type ExistentialDeposit = ExistentialDeposit;
type WeightInfo = ();
type MaxLocks = MaxLocks;
+ type MaxReserves = ();
+ type ReserveIdentifier = [u8; 8];
}
parameter_types! {
@@ -100,40 +102,40 @@
type Timestamp = pallet_timestamp::Pallet<Test>;
type Randomness = pallet_randomness_collective_flip::Pallet<Test>;
-parameter_types! {
- pub const TombstoneDeposit: u64 = 1;
- pub const DepositPerContract: u64 = 1;
- pub const DepositPerStorageByte: u64 = 1;
- pub const DepositPerStorageItem: u64 = 1;
- pub RentFraction: Perbill = Perbill::from_rational(1u32, 30 * 24 * 60 * 10);
- pub const SurchargeReward: u64 = 1;
- pub const SignedClaimHandicap: u32 = 2;
- pub DeletionWeightLimit: u64 = u64::MAX;//Perbill::from_percent(10);
- pub DeletionQueueDepth: u32 = 10;
- pub Schedule: pallet_contracts::Schedule<Test> = Default::default();
-}
+// parameter_types! {
+// pub const TombstoneDeposit: u64 = 1;
+// pub const DepositPerContract: u64 = 1;
+// pub const DepositPerStorageByte: u64 = 1;
+// pub const DepositPerStorageItem: u64 = 1;
+// pub RentFraction: Perbill = Perbill::from_rational(1u32, 30 * 24 * 60 * 10);
+// pub const SurchargeReward: u64 = 1;
+// pub const SignedClaimHandicap: u32 = 2;
+// pub DeletionWeightLimit: u64 = u64::MAX;//Perbill::from_percent(10);
+// pub DeletionQueueDepth: u32 = 10;
+// pub Schedule: pallet_contracts::Schedule<Test> = Default::default();
+// }
-impl pallet_contracts::Config for Test {
- type Time = Timestamp;
- type Randomness = Randomness;
- type Currency = pallet_balances::Pallet<Test>;
- type Event = ();
- type RentPayment = ();
- type SignedClaimHandicap = SignedClaimHandicap;
- type TombstoneDeposit = TombstoneDeposit;
- type DepositPerContract = DepositPerContract;
- type DepositPerStorageByte = DepositPerStorageByte;
- type DepositPerStorageItem = DepositPerStorageItem;
- type RentFraction = RentFraction;
- type SurchargeReward = SurchargeReward;
- type DeletionWeightLimit = DeletionWeightLimit;
- type DeletionQueueDepth = DeletionQueueDepth;
- type ChainExtension = ();
- type WeightPrice = ();
- type WeightInfo = pallet_contracts::weights::SubstrateWeight<Self>;
- type Schedule = Schedule;
- type CallStack = [pallet_contracts::Frame<Self>; 31];
-}
+// impl pallet_contracts::Config for Test {
+// type Time = Timestamp;
+// type Randomness = Randomness;
+// type Currency = pallet_balances::Pallet<Test>;
+// type Event = ();
+// type RentPayment = ();
+// type SignedClaimHandicap = SignedClaimHandicap;
+// type TombstoneDeposit = TombstoneDeposit;
+// type DepositPerContract = DepositPerContract;
+// type DepositPerStorageByte = DepositPerStorageByte;
+// type DepositPerStorageItem = DepositPerStorageItem;
+// type RentFraction = RentFraction;
+// type SurchargeReward = SurchargeReward;
+// type DeletionWeightLimit = DeletionWeightLimit;
+// type DeletionQueueDepth = DeletionQueueDepth;
+// type ChainExtension = ();
+// type WeightPrice = ();
+// type WeightInfo = pallet_contracts::weights::SubstrateWeight<Self>;
+// type Schedule = Schedule;
+// type CallStack = [pallet_contracts::Frame<Self>; 31];
+// }
parameter_types! {
pub const CollectionCreationPrice: u32 = 0;
pallets/nft/src/tests.rsdiffbeforeafterboth1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode, Ownership, ChainLimits, CreateItemData};5use nft_data_structs::{6 CreateNftData, CreateFungibleData, CreateReFungibleData, CollectionId, TokenId,7 MAX_DECIMAL_POINTS,8};9use frame_support::{assert_noop, assert_ok};10use frame_system::{RawOrigin};1112fn default_collection_numbers_limit() -> u32 {13 1014}1516fn default_limits() {17 assert_ok!(TemplateModule::set_chain_limits(18 RawOrigin::Root.into(),19 ChainLimits {20 collection_numbers_limit: default_collection_numbers_limit(),21 account_token_ownership_limit: 10,22 collections_admins_limit: 5,23 custom_data_limit: 2048,24 nft_sponsor_transfer_timeout: 15,25 fungible_sponsor_transfer_timeout: 15,26 refungible_sponsor_transfer_timeout: 15,27 const_on_chain_schema_limit: 1024,28 offchain_schema_limit: 1024,29 variable_on_chain_schema_limit: 1024,30 }31 ));32}3334fn default_nft_data() -> CreateNftData {35 CreateNftData {36 const_data: vec![1, 2, 3],37 variable_data: vec![3, 2, 1],38 }39}4041fn default_fungible_data() -> CreateFungibleData {42 CreateFungibleData { value: 5 }43}4445fn default_re_fungible_data() -> CreateReFungibleData {46 CreateReFungibleData {47 const_data: vec![1, 2, 3],48 variable_data: vec![3, 2, 1],49 pieces: 1023,50 }51}5253fn create_test_collection_for_owner(54 mode: &CollectionMode,55 owner: u64,56 id: CollectionId,57) -> CollectionId {58 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();59 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();60 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();6162 let origin1 = Origin::signed(owner);63 assert_ok!(TemplateModule::create_collection(64 origin1,65 col_name1,66 col_desc1,67 token_prefix1,68 mode.clone()69 ));7071 let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();72 let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();73 let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();74 assert_eq!(TemplateModule::collection_id(id).unwrap().owner, owner);75 assert_eq!(76 TemplateModule::collection_id(id).unwrap().name,77 saved_col_name78 );79 assert_eq!(TemplateModule::collection_id(id).unwrap().mode, *mode);80 assert_eq!(81 TemplateModule::collection_id(id).unwrap().description,82 saved_description83 );84 assert_eq!(85 TemplateModule::collection_id(id).unwrap().token_prefix,86 saved_prefix87 );88 id89}9091fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {92 create_test_collection_for_owner(&mode, 1, id)93}9495fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {96 let origin1 = Origin::signed(1);97 assert_ok!(TemplateModule::create_item(98 origin1,99 collection_id,100 account(1),101 data.clone()102 ));103}104105fn account(sub: u64) -> TestCrossAccountId {106 TestCrossAccountId::from_sub(sub)107}108109// Use cases tests region110// #region111112#[test]113fn set_version_schema() {114 new_test_ext().execute_with(|| {115 default_limits();116 let origin1 = Origin::signed(1);117 let collection_id = create_test_collection(&CollectionMode::NFT, 1);118119 assert_ok!(TemplateModule::set_schema_version(120 origin1,121 collection_id,122 SchemaVersion::Unique123 ));124 assert_eq!(125 TemplateModule::collection_id(collection_id)126 .unwrap()127 .schema_version,128 SchemaVersion::Unique129 );130 });131}132133#[test]134fn create_fungible_collection_fails_with_large_decimal_numbers() {135 new_test_ext().execute_with(|| {136 default_limits();137138 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();139 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();140 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();141142 let origin1 = Origin::signed(1);143 assert_noop!(144 TemplateModule::create_collection(145 origin1,146 col_name1,147 col_desc1,148 token_prefix1,149 CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)150 ),151 Error::<Test>::CollectionDecimalPointLimitExceeded152 );153 });154}155156#[test]157fn create_nft_item() {158 new_test_ext().execute_with(|| {159 default_limits();160 let collection_id = create_test_collection(&CollectionMode::NFT, 1);161162 let data = default_nft_data();163 create_test_item(collection_id, &data.clone().into());164 let item = TemplateModule::nft_item_id(collection_id, 1).unwrap();165 assert_eq!(item.const_data, data.const_data);166 assert_eq!(item.variable_data, data.variable_data);167 });168}169170// Use cases tests region171// #region172#[test]173fn create_nft_multiple_items() {174 new_test_ext().execute_with(|| {175 default_limits();176177 create_test_collection(&CollectionMode::NFT, 1);178179 let origin1 = Origin::signed(1);180181 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];182183 assert_ok!(TemplateModule::create_multiple_items(184 origin1,185 1,186 account(1),187 items_data188 .clone()189 .into_iter()190 .map(|d| { d.into() })191 .collect()192 ));193 for (index, data) in items_data.iter().enumerate() {194 let item = TemplateModule::nft_item_id(1, (index + 1) as TokenId).unwrap();195 assert_eq!(item.const_data.to_vec(), data.const_data);196 assert_eq!(item.variable_data.to_vec(), data.variable_data);197 }198 });199}200201#[test]202fn create_refungible_item() {203 new_test_ext().execute_with(|| {204 default_limits();205 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);206207 let data = default_re_fungible_data();208 create_test_item(collection_id, &data.clone().into());209 let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();210 assert_eq!(item.const_data, data.const_data);211 assert_eq!(item.variable_data, data.variable_data);212 assert_eq!(213 item.owner[0],214 Ownership {215 owner: account(1),216 fraction: 1023217 }218 );219 });220}221222#[test]223fn create_multiple_refungible_items() {224 new_test_ext().execute_with(|| {225 default_limits();226227 create_test_collection(&CollectionMode::ReFungible, 1);228229 let origin1 = Origin::signed(1);230231 let items_data = vec![232 default_re_fungible_data(),233 default_re_fungible_data(),234 default_re_fungible_data(),235 ];236237 assert_ok!(TemplateModule::create_multiple_items(238 origin1,239 1,240 account(1),241 items_data242 .clone()243 .into_iter()244 .map(|d| { d.into() })245 .collect()246 ));247 for (index, data) in items_data.iter().enumerate() {248 let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId).unwrap();249 assert_eq!(item.const_data.to_vec(), data.const_data);250 assert_eq!(item.variable_data.to_vec(), data.variable_data);251 assert_eq!(252 item.owner[0],253 Ownership {254 owner: account(1),255 fraction: 1023256 }257 );258 }259 });260}261262#[test]263fn create_fungible_item() {264 new_test_ext().execute_with(|| {265 default_limits();266267 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);268269 let data = default_fungible_data();270 create_test_item(collection_id, &data.into());271272 assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).value, 5);273 });274}275276//#[test]277// fn create_multiple_fungible_items() {278// new_test_ext().execute_with(|| {279// default_limits();280281// create_test_collection(&CollectionMode::Fungible(3), 1);282283// let origin1 = Origin::signed(1);284285// let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];286287// assert_ok!(TemplateModule::create_multiple_items(288// origin1.clone(),289// 1,290// 1,291// items_data.clone().into_iter().map(|d| { d.into() }).collect()292// ));293294// for (index, _) in items_data.iter().enumerate() {295// assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);296// }297// assert_eq!(TemplateModule::balance_count(1, 1), 3000);298// assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);299// });300// }301302#[test]303fn transfer_fungible_item() {304 new_test_ext().execute_with(|| {305 default_limits();306307 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);308309 let origin1 = Origin::signed(1);310 let origin2 = Origin::signed(2);311312 let data = default_fungible_data();313 create_test_item(collection_id, &data.into());314315 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 5);316 assert_eq!(TemplateModule::balance_count(1, 1), 5);317318 // change owner scenario319 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 5));320 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 0);321 assert_eq!(TemplateModule::balance_count(1, 1), 0);322 assert_eq!(TemplateModule::balance_count(1, 2), 5);323324 // split item scenario325 assert_ok!(TemplateModule::transfer(326 origin2.clone(),327 account(3),328 1,329 1,330 3331 ));332 assert_eq!(TemplateModule::balance_count(1, 2), 2);333 assert_eq!(TemplateModule::balance_count(1, 3), 3);334335 // split item and new owner has account scenario336 assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 1));337 assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 1);338 assert_eq!(TemplateModule::fungible_item_id(1, 3).value, 4);339 assert_eq!(TemplateModule::balance_count(1, 2), 1);340 assert_eq!(TemplateModule::balance_count(1, 3), 4);341 });342}343344#[test]345fn transfer_refungible_item() {346 new_test_ext().execute_with(|| {347 default_limits();348349 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);350351 let data = default_re_fungible_data();352 create_test_item(collection_id, &data.clone().into());353354 let origin1 = Origin::signed(1);355 let origin2 = Origin::signed(2);356 {357 let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();358 assert_eq!(item.const_data, data.const_data);359 assert_eq!(item.variable_data, data.variable_data);360 assert_eq!(361 item.owner[0],362 Ownership {363 owner: account(1),364 fraction: 1023365 }366 );367 }368 assert_eq!(TemplateModule::balance_count(1, 1), 1023);369 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);370371 // change owner scenario372 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1023));373 assert_eq!(374 TemplateModule::refungible_item_id(1, 1).unwrap().owner[0],375 Ownership {376 owner: account(2),377 fraction: 1023378 }379 );380 assert_eq!(TemplateModule::balance_count(1, 1), 0);381 assert_eq!(TemplateModule::balance_count(1, 2), 1023);382 // assert_eq!(TemplateModule::address_tokens(1, 1), []);383 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);384385 // split item scenario386 assert_ok!(TemplateModule::transfer(387 origin2.clone(),388 account(3),389 1,390 1,391 500392 ));393 {394 let item = TemplateModule::refungible_item_id(1, 1).unwrap();395 assert_eq!(396 item.owner[0],397 Ownership {398 owner: account(2),399 fraction: 523400 }401 );402 assert_eq!(403 item.owner[1],404 Ownership {405 owner: account(3),406 fraction: 500407 }408 );409 }410 assert_eq!(TemplateModule::balance_count(1, 2), 523);411 assert_eq!(TemplateModule::balance_count(1, 3), 500);412 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);413 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);414415 // split item and new owner has account scenario416 assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 200));417 {418 let item = TemplateModule::refungible_item_id(1, 1).unwrap();419 assert_eq!(420 item.owner[0],421 Ownership {422 owner: account(2),423 fraction: 323424 }425 );426 assert_eq!(427 item.owner[1],428 Ownership {429 owner: account(3),430 fraction: 700431 }432 );433 }434 assert_eq!(TemplateModule::balance_count(1, 2), 323);435 assert_eq!(TemplateModule::balance_count(1, 3), 700);436 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);437 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);438 });439}440441#[test]442fn transfer_nft_item() {443 new_test_ext().execute_with(|| {444 default_limits();445446 let collection_id = create_test_collection(&CollectionMode::NFT, 1);447448 let data = default_nft_data();449 create_test_item(collection_id, &data.into());450 assert_eq!(TemplateModule::balance_count(1, 1), 1);451 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);452453 let origin1 = Origin::signed(1);454 // default scenario455 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1000));456 assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(2));457 assert_eq!(TemplateModule::balance_count(1, 1), 0);458 assert_eq!(TemplateModule::balance_count(1, 2), 1);459 // assert_eq!(TemplateModule::address_tokens(1, 1), []);460 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);461 });462}463464#[test]465fn nft_approve_and_transfer_from() {466 new_test_ext().execute_with(|| {467 default_limits();468469 let collection_id = create_test_collection(&CollectionMode::NFT, 1);470471 let data = default_nft_data();472 create_test_item(collection_id, &data.into());473474 let origin1 = Origin::signed(1);475 let origin2 = Origin::signed(2);476477 assert_eq!(TemplateModule::balance_count(1, 1), 1);478 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);479480 // neg transfer481 assert_noop!(482 TemplateModule::transfer_from(origin2.clone(), account(1), account(2), 1, 1, 1),483 Error::<Test>::NoPermission484 );485486 // do approve487 assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 5));488 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);489 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);490491 assert_ok!(TemplateModule::transfer_from(492 origin2,493 account(1),494 account(3),495 1,496 1,497 1498 ));499 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);500 });501}502503#[test]504fn nft_approve_and_transfer_from_white_list() {505 new_test_ext().execute_with(|| {506 default_limits();507508 let collection_id = create_test_collection(&CollectionMode::NFT, 1);509510 let origin1 = Origin::signed(1);511 let origin2 = Origin::signed(2);512513 let data = default_nft_data();514 create_test_item(collection_id, &data.clone().into());515516 assert_eq!(517 TemplateModule::nft_item_id(1, 1).unwrap().const_data,518 data.const_data519 );520 assert_eq!(TemplateModule::balance_count(1, 1), 1);521 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);522523 assert_ok!(TemplateModule::set_mint_permission(524 origin1.clone(),525 1,526 true527 ));528 assert_ok!(TemplateModule::set_public_access_mode(529 origin1.clone(),530 1,531 AccessMode::WhiteList532 ));533 assert_ok!(TemplateModule::add_to_white_list(534 origin1.clone(),535 1,536 account(1)537 ));538 assert_ok!(TemplateModule::add_to_white_list(539 origin1.clone(),540 1,541 account(2)542 ));543 assert_ok!(TemplateModule::add_to_white_list(544 origin1.clone(),545 1,546 account(3)547 ));548549 // do approve550 assert_ok!(TemplateModule::approve(551 origin1.clone(),552 account(2),553 1,554 1,555 5556 ));557 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);558 assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));559 assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);560561 assert_ok!(TemplateModule::transfer_from(562 origin2,563 account(1),564 account(3),565 1,566 1,567 1568 ));569 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);570 });571}572573#[test]574fn refungible_approve_and_transfer_from() {575 new_test_ext().execute_with(|| {576 default_limits();577578 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);579580 let origin1 = Origin::signed(1);581 let origin2 = Origin::signed(2);582583 let data = default_re_fungible_data();584 create_test_item(collection_id, &data.into());585586 assert_eq!(TemplateModule::balance_count(1, 1), 1023);587 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);588589 assert_ok!(TemplateModule::set_mint_permission(590 origin1.clone(),591 1,592 true593 ));594 assert_ok!(TemplateModule::set_public_access_mode(595 origin1.clone(),596 1,597 AccessMode::WhiteList598 ));599 assert_ok!(TemplateModule::add_to_white_list(600 origin1.clone(),601 1,602 account(1)603 ));604 assert_ok!(TemplateModule::add_to_white_list(605 origin1.clone(),606 1,607 account(2)608 ));609 assert_ok!(TemplateModule::add_to_white_list(610 origin1.clone(),611 1,612 account(3)613 ));614615 // do approve616 assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1023));617 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1023);618619 assert_ok!(TemplateModule::transfer_from(620 origin2,621 account(1),622 account(3),623 1,624 1,625 100626 ));627 assert_eq!(TemplateModule::balance_count(1, 1), 923);628 assert_eq!(TemplateModule::balance_count(1, 3), 100);629 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);630 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);631632 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 923);633 });634}635636#[test]637fn fungible_approve_and_transfer_from() {638 new_test_ext().execute_with(|| {639 default_limits();640641 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);642643 let data = default_fungible_data();644 create_test_item(collection_id, &data.into());645646 let origin1 = Origin::signed(1);647 let origin2 = Origin::signed(2);648649 assert_eq!(TemplateModule::balance_count(1, 1), 5);650651 assert_ok!(TemplateModule::set_mint_permission(652 origin1.clone(),653 1,654 true655 ));656 assert_ok!(TemplateModule::set_public_access_mode(657 origin1.clone(),658 1,659 AccessMode::WhiteList660 ));661 assert_ok!(TemplateModule::add_to_white_list(662 origin1.clone(),663 1,664 account(1)665 ));666 assert_ok!(TemplateModule::add_to_white_list(667 origin1.clone(),668 1,669 account(2)670 ));671 assert_ok!(TemplateModule::add_to_white_list(672 origin1.clone(),673 1,674 account(3)675 ));676677 // do approve678 assert_ok!(TemplateModule::approve(679 origin1.clone(),680 account(2),681 1,682 1,683 5684 ));685 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);686 assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));687 assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);688 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);689690 assert_ok!(TemplateModule::transfer_from(691 origin2.clone(),692 account(1),693 account(3),694 1,695 1,696 4697 ));698 assert_eq!(TemplateModule::balance_count(1, 1), 1);699 assert_eq!(TemplateModule::balance_count(1, 3), 4);700701 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);702703 assert_noop!(704 TemplateModule::transfer_from(origin2, account(1), account(3), 1, 1, 4),705 Error::<Test>::NoPermission706 );707 });708}709710#[test]711fn change_collection_owner() {712 new_test_ext().execute_with(|| {713 default_limits();714715 let collection_id = create_test_collection(&CollectionMode::NFT, 1);716717 let origin1 = Origin::signed(1);718 assert_ok!(TemplateModule::change_collection_owner(719 origin1,720 collection_id,721 2722 ));723 assert_eq!(724 TemplateModule::collection_id(collection_id).unwrap().owner,725 2726 );727 });728}729730#[test]731fn destroy_collection() {732 new_test_ext().execute_with(|| {733 default_limits();734735 let collection_id = create_test_collection(&CollectionMode::NFT, 1);736737 let origin1 = Origin::signed(1);738 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));739 });740}741742#[test]743fn burn_nft_item() {744 new_test_ext().execute_with(|| {745 default_limits();746747 let collection_id = create_test_collection(&CollectionMode::NFT, 1);748749 let origin1 = Origin::signed(1);750 assert_ok!(TemplateModule::add_collection_admin(751 origin1.clone(),752 collection_id,753 account(2)754 ));755756 let data = default_nft_data();757 create_test_item(collection_id, &data.into());758759 // check balance (collection with id = 1, user id = 1)760 assert_eq!(TemplateModule::balance_count(1, 1), 1);761762 // burn item763 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 5));764 assert_noop!(765 TemplateModule::burn_item(origin1, 1, 1, 5),766 Error::<Test>::TokenNotFound767 );768769 assert_eq!(TemplateModule::balance_count(1, 1), 0);770 });771}772773#[test]774fn burn_fungible_item() {775 new_test_ext().execute_with(|| {776 default_limits();777778 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);779780 let origin1 = Origin::signed(1);781 assert_ok!(TemplateModule::add_collection_admin(782 origin1.clone(),783 collection_id,784 account(2)785 ));786787 let data = default_fungible_data();788 create_test_item(collection_id, &data.into());789790 // check balance (collection with id = 1, user id = 1)791 assert_eq!(TemplateModule::balance_count(1, 1), 5);792793 // burn item794 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 5));795 assert_noop!(796 TemplateModule::burn_item(origin1, 1, 1, 5),797 Error::<Test>::TokenValueNotEnough798 );799800 assert_eq!(TemplateModule::balance_count(1, 1), 0);801 });802}803804#[test]805fn burn_refungible_item() {806 new_test_ext().execute_with(|| {807 default_limits();808809 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);810 let origin1 = Origin::signed(1);811812 assert_ok!(TemplateModule::set_mint_permission(813 origin1.clone(),814 collection_id,815 true816 ));817 assert_ok!(TemplateModule::set_public_access_mode(818 origin1.clone(),819 collection_id,820 AccessMode::WhiteList821 ));822 assert_ok!(TemplateModule::add_to_white_list(823 origin1.clone(),824 1,825 account(1)826 ));827828 assert_ok!(TemplateModule::add_collection_admin(829 origin1.clone(),830 1,831 account(2)832 ));833834 let data = default_re_fungible_data();835 create_test_item(collection_id, &data.into());836837 // check balance (collection with id = 1, user id = 2)838 assert_eq!(TemplateModule::balance_count(1, 1), 1023);839840 // burn item841 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 1023));842 assert_noop!(843 TemplateModule::burn_item(origin1, 1, 1, 1023),844 Error::<Test>::TokenNotFound845 );846847 assert_eq!(TemplateModule::balance_count(1, 1), 0);848 });849}850851#[test]852fn add_collection_admin() {853 new_test_ext().execute_with(|| {854 default_limits();855856 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);857 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);858 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);859860 let origin1 = Origin::signed(1);861862 // collection admin863 assert_ok!(TemplateModule::add_collection_admin(864 origin1.clone(),865 collection1_id,866 account(2)867 ));868 assert_ok!(TemplateModule::add_collection_admin(869 origin1,870 collection1_id,871 account(3)872 ));873874 assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(2)),);875 assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(3)),);876 });877}878879#[test]880fn remove_collection_admin() {881 new_test_ext().execute_with(|| {882 default_limits();883884 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);885 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);886 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);887888 let origin1 = Origin::signed(1);889 let origin2 = Origin::signed(2);890891 // collection admin892 assert_ok!(TemplateModule::add_collection_admin(893 origin1.clone(),894 collection1_id,895 account(2)896 ));897 assert_ok!(TemplateModule::add_collection_admin(898 origin1,899 collection1_id,900 account(3)901 ));902903 assert!(TemplateModule::admin_list_collection(1).contains(&account(2)),);904 assert!(TemplateModule::admin_list_collection(1).contains(&account(3)),);905906 // remove admin907 assert_ok!(TemplateModule::remove_collection_admin(908 origin2,909 1,910 account(3)911 ));912 assert!(!TemplateModule::admin_list_collection(1).contains(&account(3)),);913 });914}915916#[test]917fn balance_of() {918 new_test_ext().execute_with(|| {919 default_limits();920921 let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);922 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);923 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, 3);924925 // check balance before926 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);927 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);928 assert_eq!(929 TemplateModule::balance_count(re_fungible_collection_id, 1),930 0931 );932933 let nft_data = default_nft_data();934 create_test_item(nft_collection_id, &nft_data.into());935936 let fungible_data = default_fungible_data();937 create_test_item(fungible_collection_id, &fungible_data.into());938939 let re_fungible_data = default_re_fungible_data();940 create_test_item(re_fungible_collection_id, &re_fungible_data.into());941942 // check balance (collection with id = 1, user id = 1)943 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);944 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 5);945 assert_eq!(946 TemplateModule::balance_count(re_fungible_collection_id, 1),947 1023948 );949 assert_eq!(950 TemplateModule::nft_item_id(nft_collection_id, 1)951 .unwrap()952 .owner,953 account(1)954 );955 assert_eq!(956 TemplateModule::fungible_item_id(fungible_collection_id, 1).value,957 5958 );959 assert_eq!(960 TemplateModule::refungible_item_id(re_fungible_collection_id, 1)961 .unwrap()962 .owner[0]963 .owner,964 account(1)965 );966 });967}968969#[test]970fn approve() {971 new_test_ext().execute_with(|| {972 default_limits();973974 let collection_id = create_test_collection(&CollectionMode::NFT, 1);975976 let data = default_nft_data();977 create_test_item(collection_id, &data.into());978979 let origin1 = Origin::signed(1);980981 // approve982 assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1));983 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);984 });985}986987#[test]988fn transfer_from() {989 new_test_ext().execute_with(|| {990 default_limits();991992 let collection_id = create_test_collection(&CollectionMode::NFT, 1);993 let origin1 = Origin::signed(1);994 let origin2 = Origin::signed(2);995996 let data = default_nft_data();997 create_test_item(collection_id, &data.into());998999 // approve1000 assert_ok!(TemplateModule::approve(1001 origin1.clone(),1002 account(2),1003 1,1004 1,1005 11006 ));1007 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);10081009 assert_ok!(TemplateModule::set_mint_permission(1010 origin1.clone(),1011 1,1012 true1013 ));1014 assert_ok!(TemplateModule::set_public_access_mode(1015 origin1.clone(),1016 1,1017 AccessMode::WhiteList1018 ));1019 assert_ok!(TemplateModule::add_to_white_list(1020 origin1.clone(),1021 1,1022 account(1)1023 ));1024 assert_ok!(TemplateModule::add_to_white_list(1025 origin1.clone(),1026 1,1027 account(2)1028 ));1029 assert_ok!(TemplateModule::add_to_white_list(origin1, 1, account(3)));10301031 assert_ok!(TemplateModule::transfer_from(1032 origin2,1033 account(1),1034 account(2),1035 1,1036 1,1037 11038 ));10391040 // after transfer1041 assert_eq!(TemplateModule::balance_count(1, 1), 0);1042 assert_eq!(TemplateModule::balance_count(1, 2), 1);1043 });1044}10451046// #endregion10471048// Coverage tests region1049// #region10501051#[test]1052fn owner_can_add_address_to_white_list() {1053 new_test_ext().execute_with(|| {1054 default_limits();10551056 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10571058 let origin1 = Origin::signed(1);1059 assert_ok!(TemplateModule::add_to_white_list(1060 origin1,1061 collection_id,1062 account(2)1063 ));1064 assert!(TemplateModule::white_list(collection_id, 2));1065 });1066}10671068#[test]1069fn admin_can_add_address_to_white_list() {1070 new_test_ext().execute_with(|| {1071 default_limits();10721073 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1074 let origin1 = Origin::signed(1);1075 let origin2 = Origin::signed(2);10761077 assert_ok!(TemplateModule::add_collection_admin(1078 origin1,1079 collection_id,1080 account(2)1081 ));1082 assert_ok!(TemplateModule::add_to_white_list(1083 origin2,1084 collection_id,1085 account(3)1086 ));1087 assert!(TemplateModule::white_list(collection_id, 3));1088 });1089}10901091#[test]1092fn nonprivileged_user_cannot_add_address_to_white_list() {1093 new_test_ext().execute_with(|| {1094 default_limits();10951096 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10971098 let origin2 = Origin::signed(2);1099 assert_noop!(1100 TemplateModule::add_to_white_list(origin2, collection_id, account(3)),1101 Error::<Test>::NoPermission1102 );1103 });1104}11051106#[test]1107fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {1108 new_test_ext().execute_with(|| {1109 default_limits();11101111 let origin1 = Origin::signed(1);11121113 assert_noop!(1114 TemplateModule::add_to_white_list(origin1, 1, account(2)),1115 Error::<Test>::CollectionNotFound1116 );1117 });1118}11191120#[test]1121fn nobody_can_add_address_to_white_list_of_deleted_collection() {1122 new_test_ext().execute_with(|| {1123 default_limits();11241125 let collection_id = create_test_collection(&CollectionMode::NFT, 1);11261127 let origin1 = Origin::signed(1);1128 assert_ok!(TemplateModule::destroy_collection(1129 origin1.clone(),1130 collection_id1131 ));1132 assert_noop!(1133 TemplateModule::add_to_white_list(origin1, collection_id, account(2)),1134 Error::<Test>::CollectionNotFound1135 );1136 });1137}11381139// If address is already added to white list, nothing happens1140#[test]1141fn address_is_already_added_to_white_list() {1142 new_test_ext().execute_with(|| {1143 default_limits();11441145 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1146 let origin1 = Origin::signed(1);11471148 assert_ok!(TemplateModule::add_to_white_list(1149 origin1.clone(),1150 collection_id,1151 account(2)1152 ));1153 assert_ok!(TemplateModule::add_to_white_list(1154 origin1,1155 collection_id,1156 account(2)1157 ));1158 assert!(TemplateModule::white_list(collection_id, 2));1159 });1160}11611162#[test]1163fn owner_can_remove_address_from_white_list() {1164 new_test_ext().execute_with(|| {1165 default_limits();11661167 let collection_id = create_test_collection(&CollectionMode::NFT, 1);11681169 let origin1 = Origin::signed(1);1170 assert_ok!(TemplateModule::add_to_white_list(1171 origin1.clone(),1172 collection_id,1173 account(2)1174 ));1175 assert_ok!(TemplateModule::remove_from_white_list(1176 origin1,1177 collection_id,1178 account(2)1179 ));1180 assert!(!TemplateModule::white_list(collection_id, 2));1181 });1182}11831184#[test]1185fn admin_can_remove_address_from_white_list() {1186 new_test_ext().execute_with(|| {1187 default_limits();11881189 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1190 let origin1 = Origin::signed(1);1191 let origin2 = Origin::signed(2);11921193 assert_ok!(TemplateModule::add_collection_admin(1194 origin1.clone(),1195 collection_id,1196 account(2)1197 ));11981199 assert_ok!(TemplateModule::add_to_white_list(1200 origin1,1201 collection_id,1202 account(3)1203 ));1204 assert_ok!(TemplateModule::remove_from_white_list(1205 origin2,1206 collection_id,1207 account(3)1208 ));1209 assert!(!TemplateModule::white_list(collection_id, 3));1210 });1211}12121213#[test]1214fn nonprivileged_user_cannot_remove_address_from_white_list() {1215 new_test_ext().execute_with(|| {1216 default_limits();12171218 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1219 let origin1 = Origin::signed(1);1220 let origin2 = Origin::signed(2);12211222 assert_ok!(TemplateModule::add_to_white_list(1223 origin1,1224 collection_id,1225 account(2)1226 ));1227 assert_noop!(1228 TemplateModule::remove_from_white_list(origin2, collection_id, account(2)),1229 Error::<Test>::NoPermission1230 );1231 assert!(TemplateModule::white_list(collection_id, 2));1232 });1233}12341235#[test]1236fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1237 new_test_ext().execute_with(|| {1238 default_limits();1239 let origin1 = Origin::signed(1);12401241 assert_noop!(1242 TemplateModule::remove_from_white_list(origin1, 1, account(2)),1243 Error::<Test>::CollectionNotFound1244 );1245 });1246}12471248#[test]1249fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1250 new_test_ext().execute_with(|| {1251 default_limits();12521253 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1254 let origin1 = Origin::signed(1);1255 let origin2 = Origin::signed(2);12561257 assert_ok!(TemplateModule::add_to_white_list(1258 origin1.clone(),1259 collection_id,1260 account(2)1261 ));1262 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));1263 assert_noop!(1264 TemplateModule::remove_from_white_list(origin2, collection_id, account(2)),1265 Error::<Test>::CollectionNotFound1266 );1267 assert!(!TemplateModule::white_list(collection_id, 2));1268 });1269}12701271// If address is already removed from white list, nothing happens1272#[test]1273fn address_is_already_removed_from_white_list() {1274 new_test_ext().execute_with(|| {1275 default_limits();12761277 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1278 let origin1 = Origin::signed(1);12791280 assert_ok!(TemplateModule::add_to_white_list(1281 origin1.clone(),1282 collection_id,1283 account(2)1284 ));1285 assert_ok!(TemplateModule::remove_from_white_list(1286 origin1.clone(),1287 collection_id,1288 account(2)1289 ));1290 assert_ok!(TemplateModule::remove_from_white_list(1291 origin1,1292 collection_id,1293 account(2)1294 ));1295 assert!(!TemplateModule::white_list(collection_id, 2));1296 });1297}12981299// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1300#[test]1301fn white_list_test_1() {1302 new_test_ext().execute_with(|| {1303 default_limits();13041305 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13061307 let origin1 = Origin::signed(1);13081309 let data = default_nft_data();1310 create_test_item(collection_id, &data.into());13111312 assert_ok!(TemplateModule::set_public_access_mode(1313 origin1.clone(),1314 collection_id,1315 AccessMode::WhiteList1316 ));1317 assert_ok!(TemplateModule::add_to_white_list(1318 origin1.clone(),1319 collection_id,1320 account(2)1321 ));13221323 assert_noop!(1324 TemplateModule::transfer(origin1, account(3), 1, 1, 1),1325 Error::<Test>::AddresNotInWhiteList1326 );1327 });1328}13291330#[test]1331fn white_list_test_2() {1332 new_test_ext().execute_with(|| {1333 default_limits();13341335 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1336 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::WhiteList1345 ));1346 assert_ok!(TemplateModule::add_to_white_list(1347 origin1.clone(),1348 1,1349 account(1)1350 ));1351 assert_ok!(TemplateModule::add_to_white_list(1352 origin1.clone(),1353 1,1354 account(2)1355 ));13561357 // do approve1358 assert_ok!(TemplateModule::approve(1359 origin1.clone(),1360 account(1),1361 1,1362 1,1363 11364 ));1365 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);13661367 assert_ok!(TemplateModule::remove_from_white_list(1368 origin1.clone(),1369 1,1370 account(1)1371 ));13721373 assert_noop!(1374 TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),1375 Error::<Test>::AddresNotInWhiteList1376 );1377 });1378}13791380// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1381#[test]1382fn white_list_test_3() {1383 new_test_ext().execute_with(|| {1384 default_limits();13851386 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13871388 let origin1 = Origin::signed(1);13891390 let data = default_nft_data();1391 create_test_item(collection_id, &data.into());13921393 assert_ok!(TemplateModule::set_public_access_mode(1394 origin1.clone(),1395 collection_id,1396 AccessMode::WhiteList1397 ));1398 assert_ok!(TemplateModule::add_to_white_list(1399 origin1.clone(),1400 1,1401 account(1)1402 ));14031404 assert_noop!(1405 TemplateModule::transfer(origin1, account(3), 1, 1, 1),1406 Error::<Test>::AddresNotInWhiteList1407 );1408 });1409}14101411#[test]1412fn white_list_test_4() {1413 new_test_ext().execute_with(|| {1414 default_limits();14151416 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14171418 let origin1 = Origin::signed(1);14191420 let data = default_nft_data();1421 create_test_item(collection_id, &data.into());14221423 assert_ok!(TemplateModule::set_public_access_mode(1424 origin1.clone(),1425 collection_id,1426 AccessMode::WhiteList1427 ));1428 assert_ok!(TemplateModule::add_to_white_list(1429 origin1.clone(),1430 collection_id,1431 account(1)1432 ));1433 assert_ok!(TemplateModule::add_to_white_list(1434 origin1.clone(),1435 collection_id,1436 account(2)1437 ));14381439 // do approve1440 assert_ok!(TemplateModule::approve(1441 origin1.clone(),1442 account(1),1443 1,1444 1,1445 11446 ));1447 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);14481449 assert_ok!(TemplateModule::remove_from_white_list(1450 origin1.clone(),1451 collection_id,1452 account(2)1453 ));14541455 assert_noop!(1456 TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),1457 Error::<Test>::AddresNotInWhiteList1458 );1459 });1460}14611462// If Public Access mode is set to WhiteList, tokens can’t be destroyed by a non-whitelisted address (even if it owned them before enabling WhiteList mode)1463#[test]1464fn white_list_test_5() {1465 new_test_ext().execute_with(|| {1466 default_limits();14671468 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14691470 let origin1 = Origin::signed(1);14711472 let data = default_nft_data();1473 create_test_item(collection_id, &data.into());14741475 assert_ok!(TemplateModule::set_public_access_mode(1476 origin1.clone(),1477 collection_id,1478 AccessMode::WhiteList1479 ));1480 assert_noop!(1481 TemplateModule::burn_item(origin1, 1, 1, 5),1482 Error::<Test>::AddresNotInWhiteList1483 );1484 });1485}14861487// If Public Access mode is set to WhiteList, token transfers can’t be Approved by a non-whitelisted address (see Approve method).1488#[test]1489fn white_list_test_6() {1490 new_test_ext().execute_with(|| {1491 default_limits();14921493 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14941495 let origin1 = Origin::signed(1);14961497 let data = default_nft_data();1498 create_test_item(collection_id, &data.into());14991500 assert_ok!(TemplateModule::set_public_access_mode(1501 origin1.clone(),1502 collection_id,1503 AccessMode::WhiteList1504 ));15051506 // do approve1507 assert_noop!(1508 TemplateModule::approve(origin1, account(1), 1, 1, 5),1509 Error::<Test>::AddresNotInWhiteList1510 );1511 });1512}15131514// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1515// tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1516#[test]1517fn white_list_test_7() {1518 new_test_ext().execute_with(|| {1519 default_limits();15201521 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15221523 let data = default_nft_data();1524 create_test_item(collection_id, &data.into());15251526 let origin1 = Origin::signed(1);15271528 assert_ok!(TemplateModule::set_public_access_mode(1529 origin1.clone(),1530 collection_id,1531 AccessMode::WhiteList1532 ));1533 assert_ok!(TemplateModule::add_to_white_list(1534 origin1.clone(),1535 collection_id,1536 account(1)1537 ));1538 assert_ok!(TemplateModule::add_to_white_list(1539 origin1.clone(),1540 collection_id,1541 account(2)1542 ));15431544 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1));1545 });1546}15471548#[test]1549fn white_list_test_8() {1550 new_test_ext().execute_with(|| {1551 default_limits();15521553 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15541555 let data = default_nft_data();1556 create_test_item(collection_id, &data.into());15571558 let origin1 = Origin::signed(1);15591560 assert_ok!(TemplateModule::set_public_access_mode(1561 origin1.clone(),1562 collection_id,1563 AccessMode::WhiteList1564 ));1565 assert_ok!(TemplateModule::add_to_white_list(1566 origin1.clone(),1567 collection_id,1568 account(1)1569 ));1570 assert_ok!(TemplateModule::add_to_white_list(1571 origin1.clone(),1572 collection_id,1573 account(2)1574 ));15751576 // do approve1577 assert_ok!(TemplateModule::approve(1578 origin1.clone(),1579 account(1),1580 1,1581 1,1582 51583 ));1584 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 5);15851586 assert_ok!(TemplateModule::transfer_from(1587 origin1,1588 account(1),1589 account(2),1590 1,1591 1,1592 11593 ));1594 });1595}15961597// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1598#[test]1599fn white_list_test_9() {1600 new_test_ext().execute_with(|| {1601 default_limits();16021603 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1604 let origin1 = Origin::signed(1);16051606 assert_ok!(TemplateModule::set_public_access_mode(1607 origin1.clone(),1608 collection_id,1609 AccessMode::WhiteList1610 ));1611 assert_ok!(TemplateModule::set_mint_permission(1612 origin1,1613 collection_id,1614 false1615 ));16161617 let data = default_nft_data();1618 create_test_item(collection_id, &data.into());1619 });1620}16211622// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1623#[test]1624fn white_list_test_10() {1625 new_test_ext().execute_with(|| {1626 default_limits();16271628 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16291630 let origin1 = Origin::signed(1);1631 let origin2 = Origin::signed(2);16321633 assert_ok!(TemplateModule::set_public_access_mode(1634 origin1.clone(),1635 collection_id,1636 AccessMode::WhiteList1637 ));1638 assert_ok!(TemplateModule::set_mint_permission(1639 origin1.clone(),1640 collection_id,1641 false1642 ));16431644 assert_ok!(TemplateModule::add_collection_admin(1645 origin1,1646 collection_id,1647 account(2)1648 ));16491650 assert_ok!(TemplateModule::create_item(1651 origin2,1652 collection_id,1653 account(2),1654 default_nft_data().into()1655 ));1656 });1657}16581659// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and white listed address.1660#[test]1661fn white_list_test_11() {1662 new_test_ext().execute_with(|| {1663 default_limits();16641665 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16661667 let origin1 = Origin::signed(1);1668 let origin2 = Origin::signed(2);16691670 assert_ok!(TemplateModule::set_public_access_mode(1671 origin1.clone(),1672 collection_id,1673 AccessMode::WhiteList1674 ));1675 assert_ok!(TemplateModule::set_mint_permission(1676 origin1.clone(),1677 collection_id,1678 false1679 ));1680 assert_ok!(TemplateModule::add_to_white_list(1681 origin1,1682 collection_id,1683 account(2)1684 ));16851686 assert_noop!(1687 TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1688 Error::<Test>::PublicMintingNotAllowed1689 );1690 });1691}16921693// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-white listed address.1694#[test]1695fn white_list_test_12() {1696 new_test_ext().execute_with(|| {1697 default_limits();16981699 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17001701 let origin1 = Origin::signed(1);1702 let origin2 = Origin::signed(2);17031704 assert_ok!(TemplateModule::set_public_access_mode(1705 origin1.clone(),1706 collection_id,1707 AccessMode::WhiteList1708 ));1709 assert_ok!(TemplateModule::set_mint_permission(1710 origin1,1711 collection_id,1712 false1713 ));17141715 assert_noop!(1716 TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1717 Error::<Test>::PublicMintingNotAllowed1718 );1719 });1720}17211722// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1723#[test]1724fn white_list_test_13() {1725 new_test_ext().execute_with(|| {1726 default_limits();17271728 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17291730 let origin1 = Origin::signed(1);17311732 assert_ok!(TemplateModule::set_public_access_mode(1733 origin1.clone(),1734 collection_id,1735 AccessMode::WhiteList1736 ));1737 assert_ok!(TemplateModule::set_mint_permission(1738 origin1,1739 collection_id,1740 true1741 ));17421743 let data = default_nft_data();1744 create_test_item(collection_id, &data.into());1745 });1746}17471748// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1749#[test]1750fn white_list_test_14() {1751 new_test_ext().execute_with(|| {1752 default_limits();17531754 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17551756 let origin1 = Origin::signed(1);1757 let origin2 = Origin::signed(2);17581759 assert_ok!(TemplateModule::set_public_access_mode(1760 origin1.clone(),1761 collection_id,1762 AccessMode::WhiteList1763 ));1764 assert_ok!(TemplateModule::set_mint_permission(1765 origin1.clone(),1766 collection_id,1767 true1768 ));17691770 assert_ok!(TemplateModule::add_collection_admin(1771 origin1,1772 collection_id,1773 account(2)1774 ));17751776 assert_ok!(TemplateModule::create_item(1777 origin2,1778 1,1779 account(2),1780 default_nft_data().into()1781 ));1782 });1783}17841785// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-white listed address.1786#[test]1787fn white_list_test_15() {1788 new_test_ext().execute_with(|| {1789 default_limits();17901791 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17921793 let origin1 = Origin::signed(1);1794 let origin2 = Origin::signed(2);17951796 assert_ok!(TemplateModule::set_public_access_mode(1797 origin1.clone(),1798 collection_id,1799 AccessMode::WhiteList1800 ));1801 assert_ok!(TemplateModule::set_mint_permission(1802 origin1,1803 collection_id,1804 true1805 ));18061807 assert_noop!(1808 TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1809 Error::<Test>::AddresNotInWhiteList1810 );1811 });1812}18131814// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by non-privileged and white listed address.1815#[test]1816fn white_list_test_16() {1817 new_test_ext().execute_with(|| {1818 default_limits();18191820 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18211822 let origin1 = Origin::signed(1);1823 let origin2 = Origin::signed(2);18241825 assert_ok!(TemplateModule::set_public_access_mode(1826 origin1.clone(),1827 collection_id,1828 AccessMode::WhiteList1829 ));1830 assert_ok!(TemplateModule::set_mint_permission(1831 origin1.clone(),1832 collection_id,1833 true1834 ));1835 assert_ok!(TemplateModule::add_to_white_list(1836 origin1,1837 collection_id,1838 account(2)1839 ));18401841 assert_ok!(TemplateModule::create_item(1842 origin2,1843 1,1844 account(2),1845 default_nft_data().into()1846 ));1847 });1848}18491850// Total number of collections. Positive test1851#[test]1852fn total_number_collections_bound() {1853 new_test_ext().execute_with(|| {1854 default_limits();18551856 create_test_collection(&CollectionMode::NFT, 1);1857 });1858}18591860// Total number of collections. Negotive test1861#[test]1862fn total_number_collections_bound_neg() {1863 new_test_ext().execute_with(|| {1864 default_limits();18651866 let origin1 = Origin::signed(1);18671868 for i in 0..default_collection_numbers_limit() {1869 create_test_collection(&CollectionMode::NFT, i + 1);1870 }18711872 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1873 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1874 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();18751876 // 11-th collection in chain. Expects error1877 assert_noop!(1878 TemplateModule::create_collection(1879 origin1,1880 col_name1,1881 col_desc1,1882 token_prefix1,1883 CollectionMode::NFT1884 ),1885 Error::<Test>::TotalCollectionsLimitExceeded1886 );1887 });1888}18891890// Owned tokens by a single address. Positive test1891#[test]1892fn owned_tokens_bound() {1893 new_test_ext().execute_with(|| {1894 default_limits();18951896 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18971898 let data = default_nft_data();1899 create_test_item(collection_id, &data.clone().into());1900 create_test_item(collection_id, &data.into());1901 });1902}19031904// Owned tokens by a single address. Negotive test1905#[test]1906fn owned_tokens_bound_neg() {1907 new_test_ext().execute_with(|| {1908 assert_ok!(TemplateModule::set_chain_limits(1909 RawOrigin::Root.into(),1910 ChainLimits {1911 collection_numbers_limit: 10,1912 account_token_ownership_limit: 1,1913 collections_admins_limit: 5,1914 custom_data_limit: 2048,1915 nft_sponsor_transfer_timeout: 15,1916 fungible_sponsor_transfer_timeout: 15,1917 refungible_sponsor_transfer_timeout: 15,1918 const_on_chain_schema_limit: 1024,1919 offchain_schema_limit: 1024,1920 variable_on_chain_schema_limit: 1024,1921 }1922 ));19231924 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19251926 let origin1 = Origin::signed(1);1927 let data = default_nft_data();1928 create_test_item(collection_id, &data.clone().into());19291930 assert_noop!(1931 TemplateModule::create_item(origin1, 1, account(1), data.into()),1932 Error::<Test>::AddressOwnershipLimitExceeded1933 );1934 });1935}19361937// Number of collection admins. Positive test1938#[test]1939fn collection_admins_bound() {1940 new_test_ext().execute_with(|| {1941 assert_ok!(TemplateModule::set_chain_limits(1942 RawOrigin::Root.into(),1943 ChainLimits {1944 collection_numbers_limit: 10,1945 account_token_ownership_limit: 10,1946 collections_admins_limit: 2,1947 custom_data_limit: 2048,1948 nft_sponsor_transfer_timeout: 15,1949 fungible_sponsor_transfer_timeout: 15,1950 refungible_sponsor_transfer_timeout: 15,1951 const_on_chain_schema_limit: 1024,1952 offchain_schema_limit: 1024,1953 variable_on_chain_schema_limit: 1024,1954 }1955 ));19561957 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19581959 let origin1 = Origin::signed(1);19601961 assert_ok!(TemplateModule::add_collection_admin(1962 origin1.clone(),1963 collection_id,1964 account(2)1965 ));1966 assert_ok!(TemplateModule::add_collection_admin(1967 origin1,1968 collection_id,1969 account(3)1970 ));1971 });1972}19731974// Number of collection admins. Negotive test1975#[test]1976fn collection_admins_bound_neg() {1977 new_test_ext().execute_with(|| {1978 assert_ok!(TemplateModule::set_chain_limits(1979 RawOrigin::Root.into(),1980 ChainLimits {1981 collection_numbers_limit: 10,1982 account_token_ownership_limit: 1,1983 collections_admins_limit: 1,1984 custom_data_limit: 2048,1985 nft_sponsor_transfer_timeout: 15,1986 fungible_sponsor_transfer_timeout: 15,1987 refungible_sponsor_transfer_timeout: 15,1988 const_on_chain_schema_limit: 1024,1989 offchain_schema_limit: 1024,1990 variable_on_chain_schema_limit: 1024,1991 }1992 ));19931994 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19951996 let origin1 = Origin::signed(1);19971998 assert_ok!(TemplateModule::add_collection_admin(1999 origin1.clone(),2000 collection_id,2001 account(2)2002 ));2003 assert_noop!(2004 TemplateModule::add_collection_admin(origin1, collection_id, account(3)),2005 Error::<Test>::CollectionAdminsLimitExceeded2006 );2007 });2008}20092010// NFT custom data size. Negative test const_data.2011#[test]2012fn custom_data_size_nft_const_data_bound_neg() {2013 new_test_ext().execute_with(|| {2014 assert_ok!(TemplateModule::set_chain_limits(2015 RawOrigin::Root.into(),2016 ChainLimits {2017 collection_numbers_limit: 10,2018 account_token_ownership_limit: 10,2019 collections_admins_limit: 5,2020 custom_data_limit: 2,2021 nft_sponsor_transfer_timeout: 15,2022 fungible_sponsor_transfer_timeout: 15,2023 refungible_sponsor_transfer_timeout: 15,2024 const_on_chain_schema_limit: 1024,2025 offchain_schema_limit: 1024,2026 variable_on_chain_schema_limit: 1024,2027 }2028 ));20292030 let collection_id = create_test_collection(&CollectionMode::NFT, 1);20312032 let origin1 = Origin::signed(1);2033 let too_big_const_data = CreateItemData::NFT(CreateNftData {2034 const_data: vec![1, 2, 3, 4],2035 variable_data: vec![],2036 });20372038 assert_noop!(2039 TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2040 Error::<Test>::TokenConstDataLimitExceeded2041 );2042 });2043}20442045// NFT custom data size. Negative test variable_data.2046#[test]2047fn custom_data_size_nft_variable_data_bound_neg() {2048 new_test_ext().execute_with(|| {2049 assert_ok!(TemplateModule::set_chain_limits(2050 RawOrigin::Root.into(),2051 ChainLimits {2052 collection_numbers_limit: 10,2053 account_token_ownership_limit: 10,2054 collections_admins_limit: 5,2055 custom_data_limit: 2,2056 nft_sponsor_transfer_timeout: 15,2057 fungible_sponsor_transfer_timeout: 15,2058 refungible_sponsor_transfer_timeout: 15,2059 const_on_chain_schema_limit: 1024,2060 offchain_schema_limit: 1024,2061 variable_on_chain_schema_limit: 1024,2062 }2063 ));20642065 let collection_id = create_test_collection(&CollectionMode::NFT, 1);20662067 let origin1 = Origin::signed(1);2068 let too_big_const_data = CreateItemData::NFT(CreateNftData {2069 const_data: vec![],2070 variable_data: vec![1, 2, 3, 4],2071 });20722073 assert_noop!(2074 TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2075 Error::<Test>::TokenVariableDataLimitExceeded2076 );2077 });2078}20792080// Re fungible custom data size. Negative test const_data.2081#[test]2082fn custom_data_size_re_fungible_const_data_bound_neg() {2083 new_test_ext().execute_with(|| {2084 assert_ok!(TemplateModule::set_chain_limits(2085 RawOrigin::Root.into(),2086 ChainLimits {2087 collection_numbers_limit: 10,2088 account_token_ownership_limit: 10,2089 collections_admins_limit: 5,2090 custom_data_limit: 2,2091 nft_sponsor_transfer_timeout: 15,2092 fungible_sponsor_transfer_timeout: 15,2093 refungible_sponsor_transfer_timeout: 15,2094 const_on_chain_schema_limit: 1024,2095 offchain_schema_limit: 1024,2096 variable_on_chain_schema_limit: 1024,2097 }2098 ));20992100 let collection_id = create_test_collection(&CollectionMode::NFT, 1);21012102 let origin1 = Origin::signed(1);2103 let too_big_const_data = CreateItemData::NFT(CreateNftData {2104 const_data: vec![1, 2, 3, 4],2105 variable_data: vec![],2106 });21072108 assert_noop!(2109 TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2110 Error::<Test>::TokenConstDataLimitExceeded2111 );2112 });2113}21142115// Re fungible custom data size. Negative test variable_data.2116#[test]2117fn custom_data_size_re_fungible_variable_data_bound_neg() {2118 new_test_ext().execute_with(|| {2119 assert_ok!(TemplateModule::set_chain_limits(2120 RawOrigin::Root.into(),2121 ChainLimits {2122 collection_numbers_limit: 10,2123 account_token_ownership_limit: 10,2124 collections_admins_limit: 5,2125 custom_data_limit: 2,2126 nft_sponsor_transfer_timeout: 15,2127 fungible_sponsor_transfer_timeout: 15,2128 refungible_sponsor_transfer_timeout: 15,2129 const_on_chain_schema_limit: 1024,2130 offchain_schema_limit: 1024,2131 variable_on_chain_schema_limit: 1024,2132 }2133 ));21342135 let collection_id = create_test_collection(&CollectionMode::NFT, 1);21362137 let origin1 = Origin::signed(1);2138 let too_big_const_data = CreateItemData::NFT(CreateNftData {2139 const_data: vec![],2140 variable_data: vec![1, 2, 3, 4],2141 });21422143 assert_noop!(2144 TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2145 Error::<Test>::TokenVariableDataLimitExceeded2146 );2147 });2148}2149// #endregion21502151#[test]2152fn set_const_on_chain_schema() {2153 new_test_ext().execute_with(|| {2154 default_limits();21552156 let collection_id = create_test_collection(&CollectionMode::NFT, 1);21572158 let origin1 = Origin::signed(1);2159 assert_ok!(TemplateModule::set_const_on_chain_schema(2160 origin1,2161 collection_id,2162 b"test const on chain schema".to_vec()2163 ));21642165 assert_eq!(2166 TemplateModule::collection_id(collection_id)2167 .unwrap()2168 .const_on_chain_schema,2169 b"test const on chain schema".to_vec()2170 );2171 assert_eq!(2172 TemplateModule::collection_id(collection_id)2173 .unwrap()2174 .variable_on_chain_schema,2175 b"".to_vec()2176 );2177 });2178}21792180#[test]2181fn set_variable_on_chain_schema() {2182 new_test_ext().execute_with(|| {2183 default_limits();21842185 let collection_id = create_test_collection(&CollectionMode::NFT, 1);21862187 let origin1 = Origin::signed(1);2188 assert_ok!(TemplateModule::set_variable_on_chain_schema(2189 origin1,2190 collection_id,2191 b"test variable on chain schema".to_vec()2192 ));21932194 assert_eq!(2195 TemplateModule::collection_id(collection_id)2196 .unwrap()2197 .const_on_chain_schema,2198 b"".to_vec()2199 );2200 assert_eq!(2201 TemplateModule::collection_id(collection_id)2202 .unwrap()2203 .variable_on_chain_schema,2204 b"test variable on chain schema".to_vec()2205 );2206 });2207}22082209#[test]2210fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {2211 new_test_ext().execute_with(|| {2212 default_limits();22132214 let collection_id = create_test_collection(&CollectionMode::NFT, 1);22152216 let origin1 = Origin::signed(1);22172218 let data = default_nft_data();2219 create_test_item(1, &data.into());22202221 let variable_data = b"test set_variable_meta_data method.".to_vec();2222 assert_ok!(TemplateModule::set_variable_meta_data(2223 origin1,2224 collection_id,2225 1,2226 variable_data.clone()2227 ));22282229 assert_eq!(2230 TemplateModule::nft_item_id(collection_id, 1)2231 .unwrap()2232 .variable_data,2233 variable_data2234 );2235 });2236}22372238#[test]2239fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {2240 new_test_ext().execute_with(|| {2241 default_limits();22422243 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);22442245 let origin1 = Origin::signed(1);22462247 let data = default_re_fungible_data();2248 create_test_item(1, &data.into());22492250 let variable_data = b"test set_variable_meta_data method.".to_vec();2251 assert_ok!(TemplateModule::set_variable_meta_data(2252 origin1,2253 collection_id,2254 1,2255 variable_data.clone()2256 ));22572258 assert_eq!(2259 TemplateModule::refungible_item_id(collection_id, 1)2260 .unwrap()2261 .variable_data,2262 variable_data2263 );2264 });2265}22662267#[test]2268fn set_variable_meta_data_on_fungible_token_fails() {2269 new_test_ext().execute_with(|| {2270 default_limits();22712272 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);22732274 let origin1 = Origin::signed(1);22752276 let data = default_fungible_data();2277 create_test_item(1, &data.into());22782279 let variable_data = b"test set_variable_meta_data method.".to_vec();2280 assert_noop!(2281 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),2282 Error::<Test>::CantStoreMetadataInFungibleTokens2283 );2284 });2285}22862287#[test]2288fn set_variable_meta_data_on_nft_token_fails_for_big_data() {2289 new_test_ext().execute_with(|| {2290 assert_ok!(TemplateModule::set_chain_limits(2291 RawOrigin::Root.into(),2292 ChainLimits {2293 collection_numbers_limit: default_collection_numbers_limit(),2294 account_token_ownership_limit: 10,2295 collections_admins_limit: 5,2296 custom_data_limit: 10,2297 nft_sponsor_transfer_timeout: 15,2298 fungible_sponsor_transfer_timeout: 15,2299 refungible_sponsor_transfer_timeout: 15,2300 const_on_chain_schema_limit: 1024,2301 offchain_schema_limit: 1024,2302 variable_on_chain_schema_limit: 1024,2303 }2304 ));23052306 let collection_id = create_test_collection(&CollectionMode::NFT, 1);23072308 let origin1 = Origin::signed(1);23092310 let data = default_nft_data();2311 create_test_item(1, &data.into());23122313 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2314 assert_noop!(2315 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),2316 Error::<Test>::TokenVariableDataLimitExceeded2317 );2318 });2319}23202321#[test]2322fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {2323 new_test_ext().execute_with(|| {2324 assert_ok!(TemplateModule::set_chain_limits(2325 RawOrigin::Root.into(),2326 ChainLimits {2327 collection_numbers_limit: default_collection_numbers_limit(),2328 account_token_ownership_limit: 10,2329 collections_admins_limit: 5,2330 custom_data_limit: 10,2331 nft_sponsor_transfer_timeout: 15,2332 fungible_sponsor_transfer_timeout: 15,2333 refungible_sponsor_transfer_timeout: 15,2334 const_on_chain_schema_limit: 1024,2335 offchain_schema_limit: 1024,2336 variable_on_chain_schema_limit: 1024,2337 }2338 ));23392340 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);23412342 let origin1 = Origin::signed(1);23432344 let data = default_re_fungible_data();2345 create_test_item(1, &data.into());23462347 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2348 assert_noop!(2349 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),2350 Error::<Test>::TokenVariableDataLimitExceeded2351 );2352 });2353}1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode, Ownership, ChainLimits, CreateItemData};5use nft_data_structs::{6 CreateNftData, CreateFungibleData, CreateReFungibleData, CollectionId, TokenId,7 MAX_DECIMAL_POINTS,8};9use frame_support::{assert_noop, assert_ok};10use frame_system::{RawOrigin};1112fn default_collection_numbers_limit() -> u32 {13 1014}1516fn default_limits() {17 assert_ok!(TemplateModule::set_chain_limits(18 RawOrigin::Root.into(),19 ChainLimits {20 collection_numbers_limit: default_collection_numbers_limit(),21 account_token_ownership_limit: 10,22 collections_admins_limit: 5,23 custom_data_limit: 2048,24 nft_sponsor_transfer_timeout: 15,25 fungible_sponsor_transfer_timeout: 15,26 refungible_sponsor_transfer_timeout: 15,27 const_on_chain_schema_limit: 1024,28 offchain_schema_limit: 1024,29 variable_on_chain_schema_limit: 1024,30 }31 ));32}3334fn default_nft_data() -> CreateNftData {35 CreateNftData {36 const_data: vec![1, 2, 3],37 variable_data: vec![3, 2, 1],38 }39}4041fn default_fungible_data() -> CreateFungibleData {42 CreateFungibleData { value: 5 }43}4445fn default_re_fungible_data() -> CreateReFungibleData {46 CreateReFungibleData {47 const_data: vec![1, 2, 3],48 variable_data: vec![3, 2, 1],49 pieces: 1023,50 }51}5253fn create_test_collection_for_owner(54 mode: &CollectionMode,55 owner: u64,56 id: CollectionId,57) -> CollectionId {58 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();59 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();60 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();6162 let origin1 = Origin::signed(owner);63 assert_ok!(TemplateModule::create_collection(64 origin1,65 col_name1,66 col_desc1,67 token_prefix1,68 mode.clone()69 ));7071 let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();72 let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();73 let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();74 assert_eq!(TemplateModule::collection_id(id).unwrap().owner, owner);75 assert_eq!(76 TemplateModule::collection_id(id).unwrap().name,77 saved_col_name78 );79 assert_eq!(TemplateModule::collection_id(id).unwrap().mode, *mode);80 assert_eq!(81 TemplateModule::collection_id(id).unwrap().description,82 saved_description83 );84 assert_eq!(85 TemplateModule::collection_id(id).unwrap().token_prefix,86 saved_prefix87 );88 id89}9091fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {92 create_test_collection_for_owner(&mode, 1, id)93}9495fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {96 let origin1 = Origin::signed(1);97 assert_ok!(TemplateModule::create_item(98 origin1,99 collection_id,100 account(1),101 data.clone()102 ));103}104105fn account(sub: u64) -> TestCrossAccountId {106 TestCrossAccountId::from_sub(sub)107}108109// Use cases tests region110// #region111112#[test]113fn set_version_schema() {114 new_test_ext().execute_with(|| {115 default_limits();116 let origin1 = Origin::signed(1);117 let collection_id = create_test_collection(&CollectionMode::NFT, 1);118119 assert_ok!(TemplateModule::set_schema_version(120 origin1,121 collection_id,122 SchemaVersion::Unique123 ));124 assert_eq!(125 TemplateModule::collection_id(collection_id)126 .unwrap()127 .schema_version,128 SchemaVersion::Unique129 );130 });131}132133#[test]134fn create_fungible_collection_fails_with_large_decimal_numbers() {135 new_test_ext().execute_with(|| {136 default_limits();137138 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();139 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();140 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();141142 let origin1 = Origin::signed(1);143 assert_noop!(144 TemplateModule::create_collection(145 origin1,146 col_name1,147 col_desc1,148 token_prefix1,149 CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)150 ),151 Error::<Test>::CollectionDecimalPointLimitExceeded152 );153 });154}155156#[test]157fn create_nft_item() {158 new_test_ext().execute_with(|| {159 default_limits();160 let collection_id = create_test_collection(&CollectionMode::NFT, 1);161162 let data = default_nft_data();163 create_test_item(collection_id, &data.clone().into());164 let item = TemplateModule::nft_item_id(collection_id, 1).unwrap();165 assert_eq!(item.const_data, data.const_data);166 assert_eq!(item.variable_data, data.variable_data);167 });168}169170// Use cases tests region171// #region172#[test]173fn create_nft_multiple_items() {174 new_test_ext().execute_with(|| {175 default_limits();176177 create_test_collection(&CollectionMode::NFT, 1);178179 let origin1 = Origin::signed(1);180181 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];182183 assert_ok!(TemplateModule::create_multiple_items(184 origin1,185 1,186 account(1),187 items_data188 .clone()189 .into_iter()190 .map(|d| { d.into() })191 .collect()192 ));193 for (index, data) in items_data.iter().enumerate() {194 let item = TemplateModule::nft_item_id(1, (index + 1) as TokenId).unwrap();195 assert_eq!(item.const_data.to_vec(), data.const_data);196 assert_eq!(item.variable_data.to_vec(), data.variable_data);197 }198 });199}200201#[test]202fn create_refungible_item() {203 new_test_ext().execute_with(|| {204 default_limits();205 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);206207 let data = default_re_fungible_data();208 create_test_item(collection_id, &data.clone().into());209 let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();210 assert_eq!(item.const_data, data.const_data);211 assert_eq!(item.variable_data, data.variable_data);212 assert_eq!(213 item.owner[0],214 Ownership {215 owner: account(1),216 fraction: 1023217 }218 );219 });220}221222#[test]223fn create_multiple_refungible_items() {224 new_test_ext().execute_with(|| {225 default_limits();226227 create_test_collection(&CollectionMode::ReFungible, 1);228229 let origin1 = Origin::signed(1);230231 let items_data = vec![232 default_re_fungible_data(),233 default_re_fungible_data(),234 default_re_fungible_data(),235 ];236237 assert_ok!(TemplateModule::create_multiple_items(238 origin1,239 1,240 account(1),241 items_data242 .clone()243 .into_iter()244 .map(|d| { d.into() })245 .collect()246 ));247 for (index, data) in items_data.iter().enumerate() {248 let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId).unwrap();249 assert_eq!(item.const_data.to_vec(), data.const_data);250 assert_eq!(item.variable_data.to_vec(), data.variable_data);251 assert_eq!(252 item.owner[0],253 Ownership {254 owner: account(1),255 fraction: 1023256 }257 );258 }259 });260}261262#[test]263fn create_fungible_item() {264 new_test_ext().execute_with(|| {265 default_limits();266267 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);268269 let data = default_fungible_data();270 create_test_item(collection_id, &data.into());271272 assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).value, 5);273 });274}275276//#[test]277// fn create_multiple_fungible_items() {278// new_test_ext().execute_with(|| {279// default_limits();280281// create_test_collection(&CollectionMode::Fungible(3), 1);282283// let origin1 = Origin::signed(1);284285// let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];286287// assert_ok!(TemplateModule::create_multiple_items(288// origin1.clone(),289// 1,290// 1,291// items_data.clone().into_iter().map(|d| { d.into() }).collect()292// ));293294// for (index, _) in items_data.iter().enumerate() {295// assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);296// }297// assert_eq!(TemplateModule::balance_count(1, 1), 3000);298// assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);299// });300// }301302#[test]303fn transfer_fungible_item() {304 new_test_ext().execute_with(|| {305 default_limits();306307 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);308309 let origin1 = Origin::signed(1);310 let origin2 = Origin::signed(2);311312 let data = default_fungible_data();313 create_test_item(collection_id, &data.into());314315 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 5);316 assert_eq!(TemplateModule::balance_count(1, 1), 5);317318 // change owner scenario319 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 5));320 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 0);321 assert_eq!(TemplateModule::balance_count(1, 1), 0);322 assert_eq!(TemplateModule::balance_count(1, 2), 5);323324 // split item scenario325 assert_ok!(TemplateModule::transfer(326 origin2.clone(),327 account(3),328 1,329 1,330 3331 ));332 assert_eq!(TemplateModule::balance_count(1, 2), 2);333 assert_eq!(TemplateModule::balance_count(1, 3), 3);334335 // split item and new owner has account scenario336 assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 1));337 assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 1);338 assert_eq!(TemplateModule::fungible_item_id(1, 3).value, 4);339 assert_eq!(TemplateModule::balance_count(1, 2), 1);340 assert_eq!(TemplateModule::balance_count(1, 3), 4);341 });342}343344#[test]345fn transfer_refungible_item() {346 new_test_ext().execute_with(|| {347 default_limits();348349 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);350351 let data = default_re_fungible_data();352 create_test_item(collection_id, &data.clone().into());353354 let origin1 = Origin::signed(1);355 let origin2 = Origin::signed(2);356 {357 let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();358 assert_eq!(item.const_data, data.const_data);359 assert_eq!(item.variable_data, data.variable_data);360 assert_eq!(361 item.owner[0],362 Ownership {363 owner: account(1),364 fraction: 1023365 }366 );367 }368 assert_eq!(TemplateModule::balance_count(1, 1), 1023);369 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);370371 // change owner scenario372 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1023));373 assert_eq!(374 TemplateModule::refungible_item_id(1, 1).unwrap().owner[0],375 Ownership {376 owner: account(2),377 fraction: 1023378 }379 );380 assert_eq!(TemplateModule::balance_count(1, 1), 0);381 assert_eq!(TemplateModule::balance_count(1, 2), 1023);382 // assert_eq!(TemplateModule::address_tokens(1, 1), []);383 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);384385 // split item scenario386 assert_ok!(TemplateModule::transfer(387 origin2.clone(),388 account(3),389 1,390 1,391 500392 ));393 {394 let item = TemplateModule::refungible_item_id(1, 1).unwrap();395 assert_eq!(396 item.owner[0],397 Ownership {398 owner: account(2),399 fraction: 523400 }401 );402 assert_eq!(403 item.owner[1],404 Ownership {405 owner: account(3),406 fraction: 500407 }408 );409 }410 assert_eq!(TemplateModule::balance_count(1, 2), 523);411 assert_eq!(TemplateModule::balance_count(1, 3), 500);412 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);413 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);414415 // split item and new owner has account scenario416 assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 200));417 {418 let item = TemplateModule::refungible_item_id(1, 1).unwrap();419 assert_eq!(420 item.owner[0],421 Ownership {422 owner: account(2),423 fraction: 323424 }425 );426 assert_eq!(427 item.owner[1],428 Ownership {429 owner: account(3),430 fraction: 700431 }432 );433 }434 assert_eq!(TemplateModule::balance_count(1, 2), 323);435 assert_eq!(TemplateModule::balance_count(1, 3), 700);436 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);437 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);438 });439}440441#[test]442fn transfer_nft_item() {443 new_test_ext().execute_with(|| {444 default_limits();445446 let collection_id = create_test_collection(&CollectionMode::NFT, 1);447448 let data = default_nft_data();449 create_test_item(collection_id, &data.into());450 assert_eq!(TemplateModule::balance_count(1, 1), 1);451 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);452453 let origin1 = Origin::signed(1);454 // default scenario455 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1000));456 assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(2));457 assert_eq!(TemplateModule::balance_count(1, 1), 0);458 assert_eq!(TemplateModule::balance_count(1, 2), 1);459 // assert_eq!(TemplateModule::address_tokens(1, 1), []);460 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);461 });462}463464#[test]465fn nft_approve_and_transfer_from() {466 new_test_ext().execute_with(|| {467 default_limits();468469 let collection_id = create_test_collection(&CollectionMode::NFT, 1);470471 let data = default_nft_data();472 create_test_item(collection_id, &data.into());473474 let origin1 = Origin::signed(1);475 let origin2 = Origin::signed(2);476477 assert_eq!(TemplateModule::balance_count(1, 1), 1);478 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);479480 // neg transfer481 assert_noop!(482 TemplateModule::transfer_from(origin2.clone(), account(1), account(2), 1, 1, 1),483 Error::<Test>::NoPermission484 );485486 // do approve487 assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 5));488 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);489 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);490491 assert_ok!(TemplateModule::transfer_from(492 origin2,493 account(1),494 account(3),495 1,496 1,497 1498 ));499 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);500 });501}502503#[test]504fn nft_approve_and_transfer_from_white_list() {505 new_test_ext().execute_with(|| {506 default_limits();507508 let collection_id = create_test_collection(&CollectionMode::NFT, 1);509510 let origin1 = Origin::signed(1);511 let origin2 = Origin::signed(2);512513 let data = default_nft_data();514 create_test_item(collection_id, &data.clone().into());515516 assert_eq!(517 TemplateModule::nft_item_id(1, 1).unwrap().const_data,518 data.const_data519 );520 assert_eq!(TemplateModule::balance_count(1, 1), 1);521 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);522523 assert_ok!(TemplateModule::set_mint_permission(524 origin1.clone(),525 1,526 true527 ));528 assert_ok!(TemplateModule::set_public_access_mode(529 origin1.clone(),530 1,531 AccessMode::WhiteList532 ));533 assert_ok!(TemplateModule::add_to_white_list(534 origin1.clone(),535 1,536 account(1)537 ));538 assert_ok!(TemplateModule::add_to_white_list(539 origin1.clone(),540 1,541 account(2)542 ));543 assert_ok!(TemplateModule::add_to_white_list(544 origin1.clone(),545 1,546 account(3)547 ));548549 // do approve550 assert_ok!(TemplateModule::approve(551 origin1.clone(),552 account(2),553 1,554 1,555 5556 ));557 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);558 assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));559 assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);560561 assert_ok!(TemplateModule::transfer_from(562 origin2,563 account(1),564 account(3),565 1,566 1,567 1568 ));569 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);570 });571}572573#[test]574fn refungible_approve_and_transfer_from() {575 new_test_ext().execute_with(|| {576 default_limits();577578 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);579580 let origin1 = Origin::signed(1);581 let origin2 = Origin::signed(2);582583 let data = default_re_fungible_data();584 create_test_item(collection_id, &data.into());585586 assert_eq!(TemplateModule::balance_count(1, 1), 1023);587 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);588589 assert_ok!(TemplateModule::set_mint_permission(590 origin1.clone(),591 1,592 true593 ));594 assert_ok!(TemplateModule::set_public_access_mode(595 origin1.clone(),596 1,597 AccessMode::WhiteList598 ));599 assert_ok!(TemplateModule::add_to_white_list(600 origin1.clone(),601 1,602 account(1)603 ));604 assert_ok!(TemplateModule::add_to_white_list(605 origin1.clone(),606 1,607 account(2)608 ));609 assert_ok!(TemplateModule::add_to_white_list(610 origin1.clone(),611 1,612 account(3)613 ));614615 // do approve616 assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1023));617 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1023);618619 assert_ok!(TemplateModule::transfer_from(620 origin2,621 account(1),622 account(3),623 1,624 1,625 100626 ));627 assert_eq!(TemplateModule::balance_count(1, 1), 923);628 assert_eq!(TemplateModule::balance_count(1, 3), 100);629 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);630 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);631632 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 923);633 });634}635636#[test]637fn fungible_approve_and_transfer_from() {638 new_test_ext().execute_with(|| {639 default_limits();640641 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);642643 let data = default_fungible_data();644 create_test_item(collection_id, &data.into());645646 let origin1 = Origin::signed(1);647 let origin2 = Origin::signed(2);648649 assert_eq!(TemplateModule::balance_count(1, 1), 5);650651 assert_ok!(TemplateModule::set_mint_permission(652 origin1.clone(),653 1,654 true655 ));656 assert_ok!(TemplateModule::set_public_access_mode(657 origin1.clone(),658 1,659 AccessMode::WhiteList660 ));661 assert_ok!(TemplateModule::add_to_white_list(662 origin1.clone(),663 1,664 account(1)665 ));666 assert_ok!(TemplateModule::add_to_white_list(667 origin1.clone(),668 1,669 account(2)670 ));671 assert_ok!(TemplateModule::add_to_white_list(672 origin1.clone(),673 1,674 account(3)675 ));676677 // do approve678 assert_ok!(TemplateModule::approve(679 origin1.clone(),680 account(2),681 1,682 1,683 5684 ));685 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);686 assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));687 assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);688 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);689690 assert_ok!(TemplateModule::transfer_from(691 origin2.clone(),692 account(1),693 account(3),694 1,695 1,696 4697 ));698 assert_eq!(TemplateModule::balance_count(1, 1), 1);699 assert_eq!(TemplateModule::balance_count(1, 3), 4);700701 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);702703 assert_noop!(704 TemplateModule::transfer_from(origin2, account(1), account(3), 1, 1, 4),705 Error::<Test>::NoPermission706 );707 });708}709710#[test]711fn change_collection_owner() {712 new_test_ext().execute_with(|| {713 default_limits();714715 let collection_id = create_test_collection(&CollectionMode::NFT, 1);716717 let origin1 = Origin::signed(1);718 assert_ok!(TemplateModule::change_collection_owner(719 origin1,720 collection_id,721 2722 ));723 assert_eq!(724 TemplateModule::collection_id(collection_id).unwrap().owner,725 2726 );727 });728}729730#[test]731fn destroy_collection() {732 new_test_ext().execute_with(|| {733 default_limits();734735 let collection_id = create_test_collection(&CollectionMode::NFT, 1);736737 let origin1 = Origin::signed(1);738 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));739 });740}741742#[test]743fn burn_nft_item() {744 new_test_ext().execute_with(|| {745 default_limits();746747 let collection_id = create_test_collection(&CollectionMode::NFT, 1);748749 let origin1 = Origin::signed(1);750 assert_ok!(TemplateModule::add_collection_admin(751 origin1.clone(),752 collection_id,753 account(2)754 ));755756 let data = default_nft_data();757 create_test_item(collection_id, &data.into());758759 // check balance (collection with id = 1, user id = 1)760 assert_eq!(TemplateModule::balance_count(1, 1), 1);761762 // burn item763 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 5));764 assert_noop!(765 TemplateModule::burn_item(origin1, 1, 1, 5),766 Error::<Test>::TokenNotFound767 );768769 assert_eq!(TemplateModule::balance_count(1, 1), 0);770 });771}772773#[test]774fn burn_fungible_item() {775 new_test_ext().execute_with(|| {776 default_limits();777778 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);779780 let origin1 = Origin::signed(1);781 assert_ok!(TemplateModule::add_collection_admin(782 origin1.clone(),783 collection_id,784 account(2)785 ));786787 let data = default_fungible_data();788 create_test_item(collection_id, &data.into());789790 // check balance (collection with id = 1, user id = 1)791 assert_eq!(TemplateModule::balance_count(1, 1), 5);792793 // burn item794 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 5));795 assert_noop!(796 TemplateModule::burn_item(origin1, 1, 1, 5),797 Error::<Test>::TokenValueNotEnough798 );799800 assert_eq!(TemplateModule::balance_count(1, 1), 0);801 });802}803804#[test]805fn burn_refungible_item() {806 new_test_ext().execute_with(|| {807 default_limits();808809 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);810 let origin1 = Origin::signed(1);811812 assert_ok!(TemplateModule::set_mint_permission(813 origin1.clone(),814 collection_id,815 true816 ));817 assert_ok!(TemplateModule::set_public_access_mode(818 origin1.clone(),819 collection_id,820 AccessMode::WhiteList821 ));822 assert_ok!(TemplateModule::add_to_white_list(823 origin1.clone(),824 1,825 account(1)826 ));827828 assert_ok!(TemplateModule::add_collection_admin(829 origin1.clone(),830 1,831 account(2)832 ));833834 let data = default_re_fungible_data();835 create_test_item(collection_id, &data.into());836837 // check balance (collection with id = 1, user id = 2)838 assert_eq!(TemplateModule::balance_count(1, 1), 1023);839840 // burn item841 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 1023));842 assert_noop!(843 TemplateModule::burn_item(origin1, 1, 1, 1023),844 Error::<Test>::TokenNotFound845 );846847 assert_eq!(TemplateModule::balance_count(1, 1), 0);848 });849}850851#[test]852fn add_collection_admin() {853 new_test_ext().execute_with(|| {854 default_limits();855856 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);857 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);858 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);859860 let origin1 = Origin::signed(1);861862 // collection admin863 assert_ok!(TemplateModule::add_collection_admin(864 origin1.clone(),865 collection1_id,866 account(2)867 ));868 assert_ok!(TemplateModule::add_collection_admin(869 origin1,870 collection1_id,871 account(3)872 ));873874 assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(2)),);875 assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(3)),);876 });877}878879#[test]880fn remove_collection_admin() {881 new_test_ext().execute_with(|| {882 default_limits();883884 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);885 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);886 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);887888 let origin1 = Origin::signed(1);889 let origin2 = Origin::signed(2);890891 // collection admin892 assert_ok!(TemplateModule::add_collection_admin(893 origin1.clone(),894 collection1_id,895 account(2)896 ));897 assert_ok!(TemplateModule::add_collection_admin(898 origin1,899 collection1_id,900 account(3)901 ));902903 assert!(TemplateModule::admin_list_collection(1).contains(&account(2)),);904 assert!(TemplateModule::admin_list_collection(1).contains(&account(3)),);905906 // remove admin907 assert_ok!(TemplateModule::remove_collection_admin(908 origin2,909 1,910 account(3)911 ));912 assert!(!TemplateModule::admin_list_collection(1).contains(&account(3)),);913 });914}915916#[test]917fn balance_of() {918 new_test_ext().execute_with(|| {919 default_limits();920921 let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);922 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);923 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, 3);924925 // check balance before926 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);927 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);928 assert_eq!(929 TemplateModule::balance_count(re_fungible_collection_id, 1),930 0931 );932933 let nft_data = default_nft_data();934 create_test_item(nft_collection_id, &nft_data.into());935936 let fungible_data = default_fungible_data();937 create_test_item(fungible_collection_id, &fungible_data.into());938939 let re_fungible_data = default_re_fungible_data();940 create_test_item(re_fungible_collection_id, &re_fungible_data.into());941942 // check balance (collection with id = 1, user id = 1)943 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);944 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 5);945 assert_eq!(946 TemplateModule::balance_count(re_fungible_collection_id, 1),947 1023948 );949 assert_eq!(950 TemplateModule::nft_item_id(nft_collection_id, 1)951 .unwrap()952 .owner,953 account(1)954 );955 assert_eq!(956 TemplateModule::fungible_item_id(fungible_collection_id, 1).value,957 5958 );959 assert_eq!(960 TemplateModule::refungible_item_id(re_fungible_collection_id, 1)961 .unwrap()962 .owner[0]963 .owner,964 account(1)965 );966 });967}968969#[test]970fn approve() {971 new_test_ext().execute_with(|| {972 default_limits();973974 let collection_id = create_test_collection(&CollectionMode::NFT, 1);975976 let data = default_nft_data();977 create_test_item(collection_id, &data.into());978979 let origin1 = Origin::signed(1);980981 // approve982 assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1));983 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);984 });985}986987#[test]988fn transfer_from() {989 new_test_ext().execute_with(|| {990 default_limits();991992 let collection_id = create_test_collection(&CollectionMode::NFT, 1);993 let origin1 = Origin::signed(1);994 let origin2 = Origin::signed(2);995996 let data = default_nft_data();997 create_test_item(collection_id, &data.into());998999 // approve1000 assert_ok!(TemplateModule::approve(1001 origin1.clone(),1002 account(2),1003 1,1004 1,1005 11006 ));1007 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);10081009 assert_ok!(TemplateModule::set_mint_permission(1010 origin1.clone(),1011 1,1012 true1013 ));1014 assert_ok!(TemplateModule::set_public_access_mode(1015 origin1.clone(),1016 1,1017 AccessMode::WhiteList1018 ));1019 assert_ok!(TemplateModule::add_to_white_list(1020 origin1.clone(),1021 1,1022 account(1)1023 ));1024 assert_ok!(TemplateModule::add_to_white_list(1025 origin1.clone(),1026 1,1027 account(2)1028 ));1029 assert_ok!(TemplateModule::add_to_white_list(origin1, 1, account(3)));10301031 assert_ok!(TemplateModule::transfer_from(1032 origin2,1033 account(1),1034 account(2),1035 1,1036 1,1037 11038 ));10391040 // after transfer1041 assert_eq!(TemplateModule::balance_count(1, 1), 0);1042 assert_eq!(TemplateModule::balance_count(1, 2), 1);1043 });1044}10451046// #endregion10471048// Coverage tests region1049// #region10501051#[test]1052fn owner_can_add_address_to_white_list() {1053 new_test_ext().execute_with(|| {1054 default_limits();10551056 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10571058 let origin1 = Origin::signed(1);1059 assert_ok!(TemplateModule::add_to_white_list(1060 origin1,1061 collection_id,1062 account(2)1063 ));1064 assert!(TemplateModule::white_list(collection_id, 2));1065 });1066}10671068#[test]1069fn admin_can_add_address_to_white_list() {1070 new_test_ext().execute_with(|| {1071 default_limits();10721073 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1074 let origin1 = Origin::signed(1);1075 let origin2 = Origin::signed(2);10761077 assert_ok!(TemplateModule::add_collection_admin(1078 origin1,1079 collection_id,1080 account(2)1081 ));1082 assert_ok!(TemplateModule::add_to_white_list(1083 origin2,1084 collection_id,1085 account(3)1086 ));1087 assert!(TemplateModule::white_list(collection_id, 3));1088 });1089}10901091#[test]1092fn nonprivileged_user_cannot_add_address_to_white_list() {1093 new_test_ext().execute_with(|| {1094 default_limits();10951096 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10971098 let origin2 = Origin::signed(2);1099 assert_noop!(1100 TemplateModule::add_to_white_list(origin2, collection_id, account(3)),1101 Error::<Test>::NoPermission1102 );1103 });1104}11051106#[test]1107fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {1108 new_test_ext().execute_with(|| {1109 default_limits();11101111 let origin1 = Origin::signed(1);11121113 assert_noop!(1114 TemplateModule::add_to_white_list(origin1, 1, account(2)),1115 Error::<Test>::CollectionNotFound1116 );1117 });1118}11191120#[test]1121fn nobody_can_add_address_to_white_list_of_deleted_collection() {1122 new_test_ext().execute_with(|| {1123 default_limits();11241125 let collection_id = create_test_collection(&CollectionMode::NFT, 1);11261127 let origin1 = Origin::signed(1);1128 assert_ok!(TemplateModule::destroy_collection(1129 origin1.clone(),1130 collection_id1131 ));1132 assert_noop!(1133 TemplateModule::add_to_white_list(origin1, collection_id, account(2)),1134 Error::<Test>::CollectionNotFound1135 );1136 });1137}11381139// If address is already added to white list, nothing happens1140#[test]1141fn address_is_already_added_to_white_list() {1142 new_test_ext().execute_with(|| {1143 default_limits();11441145 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1146 let origin1 = Origin::signed(1);11471148 assert_ok!(TemplateModule::add_to_white_list(1149 origin1.clone(),1150 collection_id,1151 account(2)1152 ));1153 assert_ok!(TemplateModule::add_to_white_list(1154 origin1,1155 collection_id,1156 account(2)1157 ));1158 assert!(TemplateModule::white_list(collection_id, 2));1159 });1160}11611162#[test]1163fn owner_can_remove_address_from_white_list() {1164 new_test_ext().execute_with(|| {1165 default_limits();11661167 let collection_id = create_test_collection(&CollectionMode::NFT, 1);11681169 let origin1 = Origin::signed(1);1170 assert_ok!(TemplateModule::add_to_white_list(1171 origin1.clone(),1172 collection_id,1173 account(2)1174 ));1175 assert_ok!(TemplateModule::remove_from_white_list(1176 origin1,1177 collection_id,1178 account(2)1179 ));1180 assert!(!TemplateModule::white_list(collection_id, 2));1181 });1182}11831184#[test]1185fn admin_can_remove_address_from_white_list() {1186 new_test_ext().execute_with(|| {1187 default_limits();11881189 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1190 let origin1 = Origin::signed(1);1191 let origin2 = Origin::signed(2);11921193 assert_ok!(TemplateModule::add_collection_admin(1194 origin1.clone(),1195 collection_id,1196 account(2)1197 ));11981199 assert_ok!(TemplateModule::add_to_white_list(1200 origin1,1201 collection_id,1202 account(3)1203 ));1204 assert_ok!(TemplateModule::remove_from_white_list(1205 origin2,1206 collection_id,1207 account(3)1208 ));1209 assert!(!TemplateModule::white_list(collection_id, 3));1210 });1211}12121213#[test]1214fn nonprivileged_user_cannot_remove_address_from_white_list() {1215 new_test_ext().execute_with(|| {1216 default_limits();12171218 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1219 let origin1 = Origin::signed(1);1220 let origin2 = Origin::signed(2);12211222 assert_ok!(TemplateModule::add_to_white_list(1223 origin1,1224 collection_id,1225 account(2)1226 ));1227 assert_noop!(1228 TemplateModule::remove_from_white_list(origin2, collection_id, account(2)),1229 Error::<Test>::NoPermission1230 );1231 assert!(TemplateModule::white_list(collection_id, 2));1232 });1233}12341235#[test]1236fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1237 new_test_ext().execute_with(|| {1238 default_limits();1239 let origin1 = Origin::signed(1);12401241 assert_noop!(1242 TemplateModule::remove_from_white_list(origin1, 1, account(2)),1243 Error::<Test>::CollectionNotFound1244 );1245 });1246}12471248#[test]1249fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1250 new_test_ext().execute_with(|| {1251 default_limits();12521253 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1254 let origin1 = Origin::signed(1);1255 let origin2 = Origin::signed(2);12561257 assert_ok!(TemplateModule::add_to_white_list(1258 origin1.clone(),1259 collection_id,1260 account(2)1261 ));1262 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));1263 assert_noop!(1264 TemplateModule::remove_from_white_list(origin2, collection_id, account(2)),1265 Error::<Test>::CollectionNotFound1266 );1267 assert!(!TemplateModule::white_list(collection_id, 2));1268 });1269}12701271// If address is already removed from white list, nothing happens1272#[test]1273fn address_is_already_removed_from_white_list() {1274 new_test_ext().execute_with(|| {1275 default_limits();12761277 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1278 let origin1 = Origin::signed(1);12791280 assert_ok!(TemplateModule::add_to_white_list(1281 origin1.clone(),1282 collection_id,1283 account(2)1284 ));1285 assert_ok!(TemplateModule::remove_from_white_list(1286 origin1.clone(),1287 collection_id,1288 account(2)1289 ));1290 assert_ok!(TemplateModule::remove_from_white_list(1291 origin1,1292 collection_id,1293 account(2)1294 ));1295 assert!(!TemplateModule::white_list(collection_id, 2));1296 });1297}12981299// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1300#[test]1301fn white_list_test_1() {1302 new_test_ext().execute_with(|| {1303 default_limits();13041305 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13061307 let origin1 = Origin::signed(1);13081309 let data = default_nft_data();1310 create_test_item(collection_id, &data.into());13111312 assert_ok!(TemplateModule::set_public_access_mode(1313 origin1.clone(),1314 collection_id,1315 AccessMode::WhiteList1316 ));1317 assert_ok!(TemplateModule::add_to_white_list(1318 origin1.clone(),1319 collection_id,1320 account(2)1321 ));13221323 assert_noop!(1324 TemplateModule::transfer(origin1, account(3), 1, 1, 1),1325 Error::<Test>::AddresNotInWhiteList1326 );1327 });1328}13291330#[test]1331fn white_list_test_2() {1332 new_test_ext().execute_with(|| {1333 default_limits();13341335 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1336 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::WhiteList1345 ));1346 assert_ok!(TemplateModule::add_to_white_list(1347 origin1.clone(),1348 1,1349 account(1)1350 ));1351 assert_ok!(TemplateModule::add_to_white_list(1352 origin1.clone(),1353 1,1354 account(2)1355 ));13561357 // do approve1358 assert_ok!(TemplateModule::approve(1359 origin1.clone(),1360 account(1),1361 1,1362 1,1363 11364 ));1365 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);13661367 assert_ok!(TemplateModule::remove_from_white_list(1368 origin1.clone(),1369 1,1370 account(1)1371 ));13721373 assert_noop!(1374 TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),1375 Error::<Test>::AddresNotInWhiteList1376 );1377 });1378}13791380// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1381#[test]1382fn white_list_test_3() {1383 new_test_ext().execute_with(|| {1384 default_limits();13851386 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13871388 let origin1 = Origin::signed(1);13891390 let data = default_nft_data();1391 create_test_item(collection_id, &data.into());13921393 assert_ok!(TemplateModule::set_public_access_mode(1394 origin1.clone(),1395 collection_id,1396 AccessMode::WhiteList1397 ));1398 assert_ok!(TemplateModule::add_to_white_list(1399 origin1.clone(),1400 1,1401 account(1)1402 ));14031404 assert_noop!(1405 TemplateModule::transfer(origin1, account(3), 1, 1, 1),1406 Error::<Test>::AddresNotInWhiteList1407 );1408 });1409}14101411#[test]1412fn white_list_test_4() {1413 new_test_ext().execute_with(|| {1414 default_limits();14151416 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14171418 let origin1 = Origin::signed(1);14191420 let data = default_nft_data();1421 create_test_item(collection_id, &data.into());14221423 assert_ok!(TemplateModule::set_public_access_mode(1424 origin1.clone(),1425 collection_id,1426 AccessMode::WhiteList1427 ));1428 assert_ok!(TemplateModule::add_to_white_list(1429 origin1.clone(),1430 collection_id,1431 account(1)1432 ));1433 assert_ok!(TemplateModule::add_to_white_list(1434 origin1.clone(),1435 collection_id,1436 account(2)1437 ));14381439 // do approve1440 assert_ok!(TemplateModule::approve(1441 origin1.clone(),1442 account(1),1443 1,1444 1,1445 11446 ));1447 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);14481449 assert_ok!(TemplateModule::remove_from_white_list(1450 origin1.clone(),1451 collection_id,1452 account(2)1453 ));14541455 assert_noop!(1456 TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),1457 Error::<Test>::AddresNotInWhiteList1458 );1459 });1460}14611462// If Public Access mode is set to WhiteList, tokens can’t be destroyed by a non-whitelisted address (even if it owned them before enabling WhiteList mode)1463#[test]1464fn white_list_test_5() {1465 new_test_ext().execute_with(|| {1466 default_limits();14671468 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14691470 let origin1 = Origin::signed(1);14711472 let data = default_nft_data();1473 create_test_item(collection_id, &data.into());14741475 assert_ok!(TemplateModule::set_public_access_mode(1476 origin1.clone(),1477 collection_id,1478 AccessMode::WhiteList1479 ));1480 assert_noop!(1481 TemplateModule::burn_item(origin1, 1, 1, 5),1482 Error::<Test>::AddresNotInWhiteList1483 );1484 });1485}14861487// If Public Access mode is set to WhiteList, token transfers can’t be Approved by a non-whitelisted address (see Approve method).1488#[test]1489fn white_list_test_6() {1490 new_test_ext().execute_with(|| {1491 default_limits();14921493 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14941495 let origin1 = Origin::signed(1);14961497 let data = default_nft_data();1498 create_test_item(collection_id, &data.into());14991500 assert_ok!(TemplateModule::set_public_access_mode(1501 origin1.clone(),1502 collection_id,1503 AccessMode::WhiteList1504 ));15051506 // do approve1507 assert_noop!(1508 TemplateModule::approve(origin1, account(1), 1, 1, 5),1509 Error::<Test>::AddresNotInWhiteList1510 );1511 });1512}15131514// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1515// tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1516#[test]1517fn white_list_test_7() {1518 new_test_ext().execute_with(|| {1519 default_limits();15201521 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15221523 let data = default_nft_data();1524 create_test_item(collection_id, &data.into());15251526 let origin1 = Origin::signed(1);15271528 assert_ok!(TemplateModule::set_public_access_mode(1529 origin1.clone(),1530 collection_id,1531 AccessMode::WhiteList1532 ));1533 assert_ok!(TemplateModule::add_to_white_list(1534 origin1.clone(),1535 collection_id,1536 account(1)1537 ));1538 assert_ok!(TemplateModule::add_to_white_list(1539 origin1.clone(),1540 collection_id,1541 account(2)1542 ));15431544 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1));1545 });1546}15471548#[test]1549fn white_list_test_8() {1550 new_test_ext().execute_with(|| {1551 default_limits();15521553 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15541555 let data = default_nft_data();1556 create_test_item(collection_id, &data.into());15571558 let origin1 = Origin::signed(1);15591560 assert_ok!(TemplateModule::set_public_access_mode(1561 origin1.clone(),1562 collection_id,1563 AccessMode::WhiteList1564 ));1565 assert_ok!(TemplateModule::add_to_white_list(1566 origin1.clone(),1567 collection_id,1568 account(1)1569 ));1570 assert_ok!(TemplateModule::add_to_white_list(1571 origin1.clone(),1572 collection_id,1573 account(2)1574 ));15751576 // do approve1577 assert_ok!(TemplateModule::approve(1578 origin1.clone(),1579 account(1),1580 1,1581 1,1582 51583 ));1584 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 5);15851586 assert_ok!(TemplateModule::transfer_from(1587 origin1,1588 account(1),1589 account(2),1590 1,1591 1,1592 11593 ));1594 });1595}15961597// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1598#[test]1599fn white_list_test_9() {1600 new_test_ext().execute_with(|| {1601 default_limits();16021603 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1604 let origin1 = Origin::signed(1);16051606 assert_ok!(TemplateModule::set_public_access_mode(1607 origin1.clone(),1608 collection_id,1609 AccessMode::WhiteList1610 ));1611 assert_ok!(TemplateModule::set_mint_permission(1612 origin1,1613 collection_id,1614 false1615 ));16161617 let data = default_nft_data();1618 create_test_item(collection_id, &data.into());1619 });1620}16211622// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1623#[test]1624fn white_list_test_10() {1625 new_test_ext().execute_with(|| {1626 default_limits();16271628 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16291630 let origin1 = Origin::signed(1);1631 let origin2 = Origin::signed(2);16321633 assert_ok!(TemplateModule::set_public_access_mode(1634 origin1.clone(),1635 collection_id,1636 AccessMode::WhiteList1637 ));1638 assert_ok!(TemplateModule::set_mint_permission(1639 origin1.clone(),1640 collection_id,1641 false1642 ));16431644 assert_ok!(TemplateModule::add_collection_admin(1645 origin1,1646 collection_id,1647 account(2)1648 ));16491650 assert_ok!(TemplateModule::create_item(1651 origin2,1652 collection_id,1653 account(2),1654 default_nft_data().into()1655 ));1656 });1657}16581659// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and white listed address.1660#[test]1661fn white_list_test_11() {1662 new_test_ext().execute_with(|| {1663 default_limits();16641665 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16661667 let origin1 = Origin::signed(1);1668 let origin2 = Origin::signed(2);16691670 assert_ok!(TemplateModule::set_public_access_mode(1671 origin1.clone(),1672 collection_id,1673 AccessMode::WhiteList1674 ));1675 assert_ok!(TemplateModule::set_mint_permission(1676 origin1.clone(),1677 collection_id,1678 false1679 ));1680 assert_ok!(TemplateModule::add_to_white_list(1681 origin1,1682 collection_id,1683 account(2)1684 ));16851686 assert_noop!(1687 TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1688 Error::<Test>::PublicMintingNotAllowed1689 );1690 });1691}16921693// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-white listed address.1694#[test]1695fn white_list_test_12() {1696 new_test_ext().execute_with(|| {1697 default_limits();16981699 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17001701 let origin1 = Origin::signed(1);1702 let origin2 = Origin::signed(2);17031704 assert_ok!(TemplateModule::set_public_access_mode(1705 origin1.clone(),1706 collection_id,1707 AccessMode::WhiteList1708 ));1709 assert_ok!(TemplateModule::set_mint_permission(1710 origin1,1711 collection_id,1712 false1713 ));17141715 assert_noop!(1716 TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1717 Error::<Test>::PublicMintingNotAllowed1718 );1719 });1720}17211722// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1723#[test]1724fn white_list_test_13() {1725 new_test_ext().execute_with(|| {1726 default_limits();17271728 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17291730 let origin1 = Origin::signed(1);17311732 assert_ok!(TemplateModule::set_public_access_mode(1733 origin1.clone(),1734 collection_id,1735 AccessMode::WhiteList1736 ));1737 assert_ok!(TemplateModule::set_mint_permission(1738 origin1,1739 collection_id,1740 true1741 ));17421743 let data = default_nft_data();1744 create_test_item(collection_id, &data.into());1745 });1746}17471748// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1749#[test]1750fn white_list_test_14() {1751 new_test_ext().execute_with(|| {1752 default_limits();17531754 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17551756 let origin1 = Origin::signed(1);1757 let origin2 = Origin::signed(2);17581759 assert_ok!(TemplateModule::set_public_access_mode(1760 origin1.clone(),1761 collection_id,1762 AccessMode::WhiteList1763 ));1764 assert_ok!(TemplateModule::set_mint_permission(1765 origin1.clone(),1766 collection_id,1767 true1768 ));17691770 assert_ok!(TemplateModule::add_collection_admin(1771 origin1,1772 collection_id,1773 account(2)1774 ));17751776 assert_ok!(TemplateModule::create_item(1777 origin2,1778 1,1779 account(2),1780 default_nft_data().into()1781 ));1782 });1783}17841785// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-white listed address.1786#[test]1787fn white_list_test_15() {1788 new_test_ext().execute_with(|| {1789 default_limits();17901791 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17921793 let origin1 = Origin::signed(1);1794 let origin2 = Origin::signed(2);17951796 assert_ok!(TemplateModule::set_public_access_mode(1797 origin1.clone(),1798 collection_id,1799 AccessMode::WhiteList1800 ));1801 assert_ok!(TemplateModule::set_mint_permission(1802 origin1,1803 collection_id,1804 true1805 ));18061807 assert_noop!(1808 TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1809 Error::<Test>::AddresNotInWhiteList1810 );1811 });1812}18131814// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by non-privileged and white listed address.1815#[test]1816fn white_list_test_16() {1817 new_test_ext().execute_with(|| {1818 default_limits();18191820 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18211822 let origin1 = Origin::signed(1);1823 let origin2 = Origin::signed(2);18241825 assert_ok!(TemplateModule::set_public_access_mode(1826 origin1.clone(),1827 collection_id,1828 AccessMode::WhiteList1829 ));1830 assert_ok!(TemplateModule::set_mint_permission(1831 origin1.clone(),1832 collection_id,1833 true1834 ));1835 assert_ok!(TemplateModule::add_to_white_list(1836 origin1,1837 collection_id,1838 account(2)1839 ));18401841 assert_ok!(TemplateModule::create_item(1842 origin2,1843 1,1844 account(2),1845 default_nft_data().into()1846 ));1847 });1848}18491850// Total number of collections. Positive test1851#[test]1852fn total_number_collections_bound() {1853 new_test_ext().execute_with(|| {1854 default_limits();18551856 create_test_collection(&CollectionMode::NFT, 1);1857 });1858}18591860// Total number of collections. Negotive test1861#[test]1862fn total_number_collections_bound_neg() {1863 new_test_ext().execute_with(|| {1864 default_limits();18651866 let origin1 = Origin::signed(1);18671868 for i in 0..default_collection_numbers_limit() {1869 create_test_collection(&CollectionMode::NFT, i + 1);1870 }18711872 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1873 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1874 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();18751876 // 11-th collection in chain. Expects error1877 assert_noop!(1878 TemplateModule::create_collection(1879 origin1,1880 col_name1,1881 col_desc1,1882 token_prefix1,1883 CollectionMode::NFT1884 ),1885 Error::<Test>::TotalCollectionsLimitExceeded1886 );1887 });1888}18891890// Owned tokens by a single address. Positive test1891#[test]1892fn owned_tokens_bound() {1893 new_test_ext().execute_with(|| {1894 default_limits();18951896 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18971898 let data = default_nft_data();1899 create_test_item(collection_id, &data.clone().into());1900 create_test_item(collection_id, &data.into());1901 });1902}19031904// Owned tokens by a single address. Negotive test1905#[test]1906fn owned_tokens_bound_neg() {1907 new_test_ext().execute_with(|| {1908 assert_ok!(TemplateModule::set_chain_limits(1909 RawOrigin::Root.into(),1910 ChainLimits {1911 collection_numbers_limit: 10,1912 account_token_ownership_limit: 1,1913 collections_admins_limit: 5,1914 custom_data_limit: 2048,1915 nft_sponsor_transfer_timeout: 15,1916 fungible_sponsor_transfer_timeout: 15,1917 refungible_sponsor_transfer_timeout: 15,1918 const_on_chain_schema_limit: 1024,1919 offchain_schema_limit: 1024,1920 variable_on_chain_schema_limit: 1024,1921 }1922 ));19231924 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19251926 let origin1 = Origin::signed(1);1927 let data = default_nft_data();1928 create_test_item(collection_id, &data.clone().into());19291930 assert_noop!(1931 TemplateModule::create_item(origin1, 1, account(1), data.into()),1932 Error::<Test>::AddressOwnershipLimitExceeded1933 );1934 });1935}19361937// Number of collection admins. Positive test1938#[test]1939fn collection_admins_bound() {1940 new_test_ext().execute_with(|| {1941 assert_ok!(TemplateModule::set_chain_limits(1942 RawOrigin::Root.into(),1943 ChainLimits {1944 collection_numbers_limit: 10,1945 account_token_ownership_limit: 10,1946 collections_admins_limit: 2,1947 custom_data_limit: 2048,1948 nft_sponsor_transfer_timeout: 15,1949 fungible_sponsor_transfer_timeout: 15,1950 refungible_sponsor_transfer_timeout: 15,1951 const_on_chain_schema_limit: 1024,1952 offchain_schema_limit: 1024,1953 variable_on_chain_schema_limit: 1024,1954 }1955 ));19561957 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19581959 let origin1 = Origin::signed(1);19601961 assert_ok!(TemplateModule::add_collection_admin(1962 origin1.clone(),1963 collection_id,1964 account(2)1965 ));1966 assert_ok!(TemplateModule::add_collection_admin(1967 origin1,1968 collection_id,1969 account(3)1970 ));1971 });1972}19731974// Number of collection admins. Negotive test1975#[test]1976fn collection_admins_bound_neg() {1977 new_test_ext().execute_with(|| {1978 assert_ok!(TemplateModule::set_chain_limits(1979 RawOrigin::Root.into(),1980 ChainLimits {1981 collection_numbers_limit: 10,1982 account_token_ownership_limit: 1,1983 collections_admins_limit: 1,1984 custom_data_limit: 2048,1985 nft_sponsor_transfer_timeout: 15,1986 fungible_sponsor_transfer_timeout: 15,1987 refungible_sponsor_transfer_timeout: 15,1988 const_on_chain_schema_limit: 1024,1989 offchain_schema_limit: 1024,1990 variable_on_chain_schema_limit: 1024,1991 }1992 ));19931994 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19951996 let origin1 = Origin::signed(1);19971998 assert_ok!(TemplateModule::add_collection_admin(1999 origin1.clone(),2000 collection_id,2001 account(2)2002 ));2003 assert_noop!(2004 TemplateModule::add_collection_admin(origin1, collection_id, account(3)),2005 Error::<Test>::CollectionAdminsLimitExceeded2006 );2007 });2008}20092010// NFT custom data size. Negative test const_data.2011#[test]2012fn custom_data_size_nft_const_data_bound_neg() {2013 new_test_ext().execute_with(|| {2014 assert_ok!(TemplateModule::set_chain_limits(2015 RawOrigin::Root.into(),2016 ChainLimits {2017 collection_numbers_limit: 10,2018 account_token_ownership_limit: 10,2019 collections_admins_limit: 5,2020 custom_data_limit: 2,2021 nft_sponsor_transfer_timeout: 15,2022 fungible_sponsor_transfer_timeout: 15,2023 refungible_sponsor_transfer_timeout: 15,2024 const_on_chain_schema_limit: 1024,2025 offchain_schema_limit: 1024,2026 variable_on_chain_schema_limit: 1024,2027 }2028 ));20292030 let collection_id = create_test_collection(&CollectionMode::NFT, 1);20312032 let origin1 = Origin::signed(1);2033 let too_big_const_data = CreateItemData::NFT(CreateNftData {2034 const_data: vec![1, 2, 3, 4],2035 variable_data: vec![],2036 });20372038 assert_noop!(2039 TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2040 Error::<Test>::TokenConstDataLimitExceeded2041 );2042 });2043}20442045// NFT custom data size. Negative test variable_data.2046#[test]2047fn custom_data_size_nft_variable_data_bound_neg() {2048 new_test_ext().execute_with(|| {2049 assert_ok!(TemplateModule::set_chain_limits(2050 RawOrigin::Root.into(),2051 ChainLimits {2052 collection_numbers_limit: 10,2053 account_token_ownership_limit: 10,2054 collections_admins_limit: 5,2055 custom_data_limit: 2,2056 nft_sponsor_transfer_timeout: 15,2057 fungible_sponsor_transfer_timeout: 15,2058 refungible_sponsor_transfer_timeout: 15,2059 const_on_chain_schema_limit: 1024,2060 offchain_schema_limit: 1024,2061 variable_on_chain_schema_limit: 1024,2062 }2063 ));20642065 let collection_id = create_test_collection(&CollectionMode::NFT, 1);20662067 let origin1 = Origin::signed(1);2068 let too_big_const_data = CreateItemData::NFT(CreateNftData {2069 const_data: vec![],2070 variable_data: vec![1, 2, 3, 4],2071 });20722073 assert_noop!(2074 TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2075 Error::<Test>::TokenVariableDataLimitExceeded2076 );2077 });2078}20792080// Re fungible custom data size. Negative test const_data.2081#[test]2082fn custom_data_size_re_fungible_const_data_bound_neg() {2083 new_test_ext().execute_with(|| {2084 assert_ok!(TemplateModule::set_chain_limits(2085 RawOrigin::Root.into(),2086 ChainLimits {2087 collection_numbers_limit: 10,2088 account_token_ownership_limit: 10,2089 collections_admins_limit: 5,2090 custom_data_limit: 2,2091 nft_sponsor_transfer_timeout: 15,2092 fungible_sponsor_transfer_timeout: 15,2093 refungible_sponsor_transfer_timeout: 15,2094 const_on_chain_schema_limit: 1024,2095 offchain_schema_limit: 1024,2096 variable_on_chain_schema_limit: 1024,2097 }2098 ));20992100 let collection_id = create_test_collection(&CollectionMode::NFT, 1);21012102 let origin1 = Origin::signed(1);2103 let too_big_const_data = CreateItemData::NFT(CreateNftData {2104 const_data: vec![1, 2, 3, 4],2105 variable_data: vec![],2106 });21072108 assert_noop!(2109 TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2110 Error::<Test>::TokenConstDataLimitExceeded2111 );2112 });2113}21142115// Re fungible custom data size. Negative test variable_data.2116#[test]2117fn custom_data_size_re_fungible_variable_data_bound_neg() {2118 new_test_ext().execute_with(|| {2119 assert_ok!(TemplateModule::set_chain_limits(2120 RawOrigin::Root.into(),2121 ChainLimits {2122 collection_numbers_limit: 10,2123 account_token_ownership_limit: 10,2124 collections_admins_limit: 5,2125 custom_data_limit: 2,2126 nft_sponsor_transfer_timeout: 15,2127 fungible_sponsor_transfer_timeout: 15,2128 refungible_sponsor_transfer_timeout: 15,2129 const_on_chain_schema_limit: 1024,2130 offchain_schema_limit: 1024,2131 variable_on_chain_schema_limit: 1024,2132 }2133 ));21342135 let collection_id = create_test_collection(&CollectionMode::NFT, 1);21362137 let origin1 = Origin::signed(1);2138 let too_big_const_data = CreateItemData::NFT(CreateNftData {2139 const_data: vec![],2140 variable_data: vec![1, 2, 3, 4],2141 });21422143 assert_noop!(2144 TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2145 Error::<Test>::TokenVariableDataLimitExceeded2146 );2147 });2148}2149// #endregion21502151#[test]2152fn set_const_on_chain_schema() {2153 new_test_ext().execute_with(|| {2154 default_limits();21552156 let collection_id = create_test_collection(&CollectionMode::NFT, 1);21572158 let origin1 = Origin::signed(1);2159 assert_ok!(TemplateModule::set_const_on_chain_schema(2160 origin1,2161 collection_id,2162 b"test const on chain schema".to_vec()2163 ));21642165 assert_eq!(2166 TemplateModule::collection_id(collection_id)2167 .unwrap()2168 .const_on_chain_schema,2169 b"test const on chain schema".to_vec()2170 );2171 assert_eq!(2172 TemplateModule::collection_id(collection_id)2173 .unwrap()2174 .variable_on_chain_schema,2175 b"".to_vec()2176 );2177 });2178}21792180#[test]2181fn set_variable_on_chain_schema() {2182 new_test_ext().execute_with(|| {2183 default_limits();21842185 let collection_id = create_test_collection(&CollectionMode::NFT, 1);21862187 let origin1 = Origin::signed(1);2188 assert_ok!(TemplateModule::set_variable_on_chain_schema(2189 origin1,2190 collection_id,2191 b"test variable on chain schema".to_vec()2192 ));21932194 assert_eq!(2195 TemplateModule::collection_id(collection_id)2196 .unwrap()2197 .const_on_chain_schema,2198 b"".to_vec()2199 );2200 assert_eq!(2201 TemplateModule::collection_id(collection_id)2202 .unwrap()2203 .variable_on_chain_schema,2204 b"test variable on chain schema".to_vec()2205 );2206 });2207}22082209#[test]2210fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {2211 new_test_ext().execute_with(|| {2212 default_limits();22132214 let collection_id = create_test_collection(&CollectionMode::NFT, 1);22152216 let origin1 = Origin::signed(1);22172218 let data = default_nft_data();2219 create_test_item(1, &data.into());22202221 let variable_data = b"test set_variable_meta_data method.".to_vec();2222 assert_ok!(TemplateModule::set_variable_meta_data(2223 origin1,2224 collection_id,2225 1,2226 variable_data.clone()2227 ));22282229 assert_eq!(2230 TemplateModule::nft_item_id(collection_id, 1)2231 .unwrap()2232 .variable_data,2233 variable_data2234 );2235 });2236}22372238#[test]2239fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {2240 new_test_ext().execute_with(|| {2241 default_limits();22422243 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);22442245 let origin1 = Origin::signed(1);22462247 let data = default_re_fungible_data();2248 create_test_item(1, &data.into());22492250 let variable_data = b"test set_variable_meta_data method.".to_vec();2251 assert_ok!(TemplateModule::set_variable_meta_data(2252 origin1,2253 collection_id,2254 1,2255 variable_data.clone()2256 ));22572258 assert_eq!(2259 TemplateModule::refungible_item_id(collection_id, 1)2260 .unwrap()2261 .variable_data,2262 variable_data2263 );2264 });2265}22662267#[test]2268fn set_variable_meta_data_on_fungible_token_fails() {2269 new_test_ext().execute_with(|| {2270 default_limits();22712272 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);22732274 let origin1 = Origin::signed(1);22752276 let data = default_fungible_data();2277 create_test_item(1, &data.into());22782279 let variable_data = b"test set_variable_meta_data method.".to_vec();2280 assert_noop!(2281 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),2282 Error::<Test>::CantStoreMetadataInFungibleTokens2283 );2284 });2285}22862287#[test]2288fn set_variable_meta_data_on_nft_token_fails_for_big_data() {2289 new_test_ext().execute_with(|| {2290 assert_ok!(TemplateModule::set_chain_limits(2291 RawOrigin::Root.into(),2292 ChainLimits {2293 collection_numbers_limit: default_collection_numbers_limit(),2294 account_token_ownership_limit: 10,2295 collections_admins_limit: 5,2296 custom_data_limit: 10,2297 nft_sponsor_transfer_timeout: 15,2298 fungible_sponsor_transfer_timeout: 15,2299 refungible_sponsor_transfer_timeout: 15,2300 const_on_chain_schema_limit: 1024,2301 offchain_schema_limit: 1024,2302 variable_on_chain_schema_limit: 1024,2303 }2304 ));23052306 let collection_id = create_test_collection(&CollectionMode::NFT, 1);23072308 let origin1 = Origin::signed(1);23092310 let data = default_nft_data();2311 create_test_item(1, &data.into());23122313 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2314 assert_noop!(2315 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),2316 Error::<Test>::TokenVariableDataLimitExceeded2317 );2318 });2319}23202321#[test]2322fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {2323 new_test_ext().execute_with(|| {2324 assert_ok!(TemplateModule::set_chain_limits(2325 RawOrigin::Root.into(),2326 ChainLimits {2327 collection_numbers_limit: default_collection_numbers_limit(),2328 account_token_ownership_limit: 10,2329 collections_admins_limit: 5,2330 custom_data_limit: 10,2331 nft_sponsor_transfer_timeout: 15,2332 fungible_sponsor_transfer_timeout: 15,2333 refungible_sponsor_transfer_timeout: 15,2334 const_on_chain_schema_limit: 1024,2335 offchain_schema_limit: 1024,2336 variable_on_chain_schema_limit: 1024,2337 }2338 ));23392340 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);23412342 let origin1 = Origin::signed(1);23432344 let data = default_re_fungible_data();2345 create_test_item(1, &data.into());23462347 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2348 assert_noop!(2349 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),2350 Error::<Test>::TokenVariableDataLimitExceeded2351 );2352 });2353}23542355#[test]2356fn collection_transfer_flag_works() {2357 new_test_ext().execute_with(|| {2358 default_limits();23592360 let origin1 = Origin::signed(1);23612362 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2363 assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, 1, true));23642365 let data = default_nft_data();2366 create_test_item(collection_id, &data.into());2367 assert_eq!(TemplateModule::balance_count(1, 1), 1);2368 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);23692370 let origin1 = Origin::signed(1);23712372 // default scenario2373 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1000));2374 assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(2));2375 assert_eq!(TemplateModule::balance_count(1, 1), 0);2376 assert_eq!(TemplateModule::balance_count(1, 2), 1);23772378 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);2379 });2380}23812382#[test]2383fn collection_transfer_flag_works_neg() {2384 new_test_ext().execute_with(|| {2385 default_limits();23862387 let origin1 = Origin::signed(1);23882389 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2390 assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, 1, false));23912392 let data = default_nft_data();2393 create_test_item(collection_id, &data.into());2394 assert_eq!(TemplateModule::balance_count(1, 1), 1);2395 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);23962397 let origin1 = Origin::signed(1);23982399 // default scenario2400 assert_noop!(2401 TemplateModule::transfer(origin1, account(2), 1, 1, 1000),2402 Error::<Test>::TransferNotAllowed2403 );2404 assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(1));2405 assert_eq!(TemplateModule::balance_count(1, 1), 1);2406 assert_eq!(TemplateModule::balance_count(1, 2), 0);24072408 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);2409 });2410}pallets/scheduler/src/lib.rsdiffbeforeafterboth--- a/pallets/scheduler/src/lib.rs
+++ b/pallets/scheduler/src/lib.rs
@@ -947,900 +947,4 @@
fn root() -> OriginCaller {
system::RawOrigin::Root.into()
}
-
- #[test]
- fn basic_scheduling_works() {
- new_test_ext().execute_with(|| {
- let call = Call::Logger(logger::Call::log(42, 1000));
- assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(
- &call
- ));
- assert_ok!(Scheduler::do_schedule(
- DispatchTime::At(4),
- None,
- 127,
- root(),
- call
- ));
- run_to_block(3);
- assert!(logger::log().is_empty());
- run_to_block(4);
- assert_eq!(logger::log(), vec![(root(), 42u32)]);
- run_to_block(100);
- assert_eq!(logger::log(), vec![(root(), 42u32)]);
- });
- }
-
- #[test]
- fn schedule_after_works() {
- new_test_ext().execute_with(|| {
- run_to_block(2);
- let call = Call::Logger(logger::Call::log(42, 1000));
- assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(
- &call
- ));
- // This will schedule the call 3 blocks after the next block... so block 3 + 3 = 6
- assert_ok!(Scheduler::do_schedule(
- DispatchTime::After(3),
- None,
- 127,
- root(),
- call
- ));
- run_to_block(5);
- assert!(logger::log().is_empty());
- run_to_block(6);
- assert_eq!(logger::log(), vec![(root(), 42u32)]);
- run_to_block(100);
- assert_eq!(logger::log(), vec![(root(), 42u32)]);
- });
- }
-
- #[test]
- fn schedule_after_zero_works() {
- new_test_ext().execute_with(|| {
- run_to_block(2);
- let call = Call::Logger(logger::Call::log(42, 1000));
- assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(
- &call
- ));
- assert_ok!(Scheduler::do_schedule(
- DispatchTime::After(0),
- None,
- 127,
- root(),
- call
- ));
- // Will trigger on the next block.
- run_to_block(3);
- assert_eq!(logger::log(), vec![(root(), 42u32)]);
- run_to_block(100);
- assert_eq!(logger::log(), vec![(root(), 42u32)]);
- });
- }
-
- #[test]
- fn periodic_scheduling_works() {
- new_test_ext().execute_with(|| {
- // at #4, every 3 blocks, 3 times.
- assert_ok!(Scheduler::do_schedule(
- DispatchTime::At(4),
- Some((3, 3)),
- 127,
- root(),
- Call::Logger(logger::Call::log(42, 1000))
- ));
- run_to_block(3);
- assert!(logger::log().is_empty());
- run_to_block(4);
- assert_eq!(logger::log(), vec![(root(), 42u32)]);
- run_to_block(6);
- assert_eq!(logger::log(), vec![(root(), 42u32)]);
- run_to_block(7);
- assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32)]);
- run_to_block(9);
- assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32)]);
- run_to_block(10);
- assert_eq!(
- logger::log(),
- vec![(root(), 42u32), (root(), 42u32), (root(), 42u32)]
- );
- run_to_block(100);
- assert_eq!(
- logger::log(),
- vec![(root(), 42u32), (root(), 42u32), (root(), 42u32)]
- );
- });
- }
-
- #[test]
- fn reschedule_works() {
- new_test_ext().execute_with(|| {
- let call = Call::Logger(logger::Call::log(42, 1000));
- assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(
- &call
- ));
- assert_eq!(
- Scheduler::do_schedule(DispatchTime::At(4), None, 127, root(), call).unwrap(),
- (4, 0)
- );
-
- run_to_block(3);
- assert!(logger::log().is_empty());
-
- assert_eq!(
- Scheduler::do_reschedule((4, 0), DispatchTime::At(6)).unwrap(),
- (6, 0)
- );
-
- assert_noop!(
- Scheduler::do_reschedule((6, 0), DispatchTime::At(6)),
- Error::<Test>::RescheduleNoChange
- );
-
- run_to_block(4);
- assert!(logger::log().is_empty());
-
- run_to_block(6);
- assert_eq!(logger::log(), vec![(root(), 42u32)]);
-
- run_to_block(100);
- assert_eq!(logger::log(), vec![(root(), 42u32)]);
- });
- }
-
- #[test]
- fn reschedule_named_works() {
- new_test_ext().execute_with(|| {
- let call = Call::Logger(logger::Call::log(42, 1000));
- assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(
- &call
- ));
- assert_eq!(
- Scheduler::do_schedule_named(
- 1u32.encode(),
- DispatchTime::At(4),
- None,
- 127,
- root(),
- call
- )
- .unwrap(),
- (4, 0)
- );
-
- run_to_block(3);
- assert!(logger::log().is_empty());
-
- assert_eq!(
- Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(6)).unwrap(),
- (6, 0)
- );
-
- assert_noop!(
- Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(6)),
- Error::<Test>::RescheduleNoChange
- );
-
- run_to_block(4);
- assert!(logger::log().is_empty());
-
- run_to_block(6);
- assert_eq!(logger::log(), vec![(root(), 42u32)]);
-
- run_to_block(100);
- assert_eq!(logger::log(), vec![(root(), 42u32)]);
- });
- }
-
- #[test]
- fn reschedule_named_perodic_works() {
- new_test_ext().execute_with(|| {
- let call = Call::Logger(logger::Call::log(42, 1000));
- assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(
- &call
- ));
- assert_eq!(
- Scheduler::do_schedule_named(
- 1u32.encode(),
- DispatchTime::At(4),
- Some((3, 3)),
- 127,
- root(),
- call
- )
- .unwrap(),
- (4, 0)
- );
-
- run_to_block(3);
- assert!(logger::log().is_empty());
-
- assert_eq!(
- Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(5)).unwrap(),
- (5, 0)
- );
- assert_eq!(
- Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(6)).unwrap(),
- (6, 0)
- );
-
- run_to_block(5);
- assert!(logger::log().is_empty());
-
- run_to_block(6);
- assert_eq!(logger::log(), vec![(root(), 42u32)]);
-
- assert_eq!(
- Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(10)).unwrap(),
- (10, 0)
- );
-
- run_to_block(9);
- assert_eq!(logger::log(), vec![(root(), 42u32)]);
-
- run_to_block(10);
- assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32)]);
-
- run_to_block(13);
- assert_eq!(
- logger::log(),
- vec![(root(), 42u32), (root(), 42u32), (root(), 42u32)]
- );
-
- run_to_block(100);
- assert_eq!(
- logger::log(),
- vec![(root(), 42u32), (root(), 42u32), (root(), 42u32)]
- );
- });
- }
-
- #[test]
- fn cancel_named_scheduling_works_with_normal_cancel() {
- new_test_ext().execute_with(|| {
- // at #4.
- Scheduler::do_schedule_named(
- 1u32.encode(),
- DispatchTime::At(4),
- None,
- 127,
- root(),
- Call::Logger(logger::Call::log(69, 1000)),
- )
- .unwrap();
- let i = Scheduler::do_schedule(
- DispatchTime::At(4),
- None,
- 127,
- root(),
- Call::Logger(logger::Call::log(42, 1000)),
- )
- .unwrap();
- run_to_block(3);
- assert!(logger::log().is_empty());
- assert_ok!(Scheduler::do_cancel_named(None, 1u32.encode()));
- assert_ok!(Scheduler::do_cancel(None, i));
- run_to_block(100);
- assert!(logger::log().is_empty());
- });
- }
-
- #[test]
- fn cancel_named_periodic_scheduling_works() {
- new_test_ext().execute_with(|| {
- // at #4, every 3 blocks, 3 times.
- Scheduler::do_schedule_named(
- 1u32.encode(),
- DispatchTime::At(4),
- Some((3, 3)),
- 127,
- root(),
- Call::Logger(logger::Call::log(42, 1000)),
- )
- .unwrap();
- // same id results in error.
- assert!(Scheduler::do_schedule_named(
- 1u32.encode(),
- DispatchTime::At(4),
- None,
- 127,
- root(),
- Call::Logger(logger::Call::log(69, 1000))
- )
- .is_err());
- // different id is ok.
- Scheduler::do_schedule_named(
- 2u32.encode(),
- DispatchTime::At(8),
- None,
- 127,
- root(),
- Call::Logger(logger::Call::log(69, 1000)),
- )
- .unwrap();
- run_to_block(3);
- assert!(logger::log().is_empty());
- run_to_block(4);
- assert_eq!(logger::log(), vec![(root(), 42u32)]);
- run_to_block(6);
- assert_ok!(Scheduler::do_cancel_named(None, 1u32.encode()));
- run_to_block(100);
- assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 69u32)]);
- });
- }
-
- #[test]
- fn scheduler_respects_weight_limits() {
- new_test_ext().execute_with(|| {
- assert_ok!(Scheduler::do_schedule(
- DispatchTime::At(4),
- None,
- 127,
- root(),
- Call::Logger(logger::Call::log(42, MaximumSchedulerWeight::get() / 2))
- ));
- assert_ok!(Scheduler::do_schedule(
- DispatchTime::At(4),
- None,
- 127,
- root(),
- Call::Logger(logger::Call::log(69, MaximumSchedulerWeight::get() / 2))
- ));
- // 69 and 42 do not fit together
- run_to_block(4);
- assert_eq!(logger::log(), vec![(root(), 42u32)]);
- run_to_block(5);
- assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 69u32)]);
- });
- }
-
- #[test]
- fn scheduler_respects_hard_deadlines_more() {
- new_test_ext().execute_with(|| {
- assert_ok!(Scheduler::do_schedule(
- DispatchTime::At(4),
- None,
- 0,
- root(),
- Call::Logger(logger::Call::log(42, MaximumSchedulerWeight::get() / 2))
- ));
- assert_ok!(Scheduler::do_schedule(
- DispatchTime::At(4),
- None,
- 0,
- root(),
- Call::Logger(logger::Call::log(69, MaximumSchedulerWeight::get() / 2))
- ));
- // With base weights, 69 and 42 should not fit together, but do because of hard deadlines
- run_to_block(4);
- assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 69u32)]);
- });
- }
-
- #[test]
- fn scheduler_respects_priority_ordering() {
- new_test_ext().execute_with(|| {
- assert_ok!(Scheduler::do_schedule(
- DispatchTime::At(4),
- None,
- 1,
- root(),
- Call::Logger(logger::Call::log(42, MaximumSchedulerWeight::get() / 2))
- ));
- assert_ok!(Scheduler::do_schedule(
- DispatchTime::At(4),
- None,
- 0,
- root(),
- Call::Logger(logger::Call::log(69, MaximumSchedulerWeight::get() / 2))
- ));
- run_to_block(4);
- assert_eq!(logger::log(), vec![(root(), 69u32), (root(), 42u32)]);
- });
- }
-
- #[test]
- fn scheduler_respects_priority_ordering_with_soft_deadlines() {
- new_test_ext().execute_with(|| {
- assert_ok!(Scheduler::do_schedule(
- DispatchTime::At(4),
- None,
- 255,
- root(),
- Call::Logger(logger::Call::log(42, MaximumSchedulerWeight::get() / 3))
- ));
- assert_ok!(Scheduler::do_schedule(
- DispatchTime::At(4),
- None,
- 127,
- root(),
- Call::Logger(logger::Call::log(69, MaximumSchedulerWeight::get() / 2))
- ));
- assert_ok!(Scheduler::do_schedule(
- DispatchTime::At(4),
- None,
- 126,
- root(),
- Call::Logger(logger::Call::log(2600, MaximumSchedulerWeight::get() / 2))
- ));
-
- // 2600 does not fit with 69 or 42, but has higher priority, so will go through
- run_to_block(4);
- assert_eq!(logger::log(), vec![(root(), 2600u32)]);
- // 69 and 42 fit together
- run_to_block(5);
- assert_eq!(
- logger::log(),
- vec![(root(), 2600u32), (root(), 69u32), (root(), 42u32)]
- );
- });
- }
-
- #[test]
- fn on_initialize_weight_is_correct() {
- new_test_ext().execute_with(|| {
- let base_weight: Weight =
- <Test as frame_system::Config>::DbWeight::get().reads_writes(1, 2);
- let base_multiplier = 0;
- let named_multiplier = <Test as frame_system::Config>::DbWeight::get().writes(1);
- let periodic_multiplier =
- <Test as frame_system::Config>::DbWeight::get().reads_writes(1, 1);
-
- // Named
- assert_ok!(Scheduler::do_schedule_named(
- 1u32.encode(),
- DispatchTime::At(1),
- None,
- 255,
- root(),
- Call::Logger(logger::Call::log(3, MaximumSchedulerWeight::get() / 3))
- ));
- // Anon Periodic
- assert_ok!(Scheduler::do_schedule(
- DispatchTime::At(1),
- Some((1000, 3)),
- 128,
- root(),
- Call::Logger(logger::Call::log(42, MaximumSchedulerWeight::get() / 3))
- ));
- // Anon
- assert_ok!(Scheduler::do_schedule(
- DispatchTime::At(1),
- None,
- 127,
- root(),
- Call::Logger(logger::Call::log(69, MaximumSchedulerWeight::get() / 2))
- ));
- // Named Periodic
- assert_ok!(Scheduler::do_schedule_named(
- 2u32.encode(),
- DispatchTime::At(1),
- Some((1000, 3)),
- 126,
- root(),
- Call::Logger(logger::Call::log(2600, MaximumSchedulerWeight::get() / 2))
- ));
-
- // Will include the named periodic only
- let actual_weight = Scheduler::on_initialize(1);
- let call_weight = MaximumSchedulerWeight::get() / 2;
- assert_eq!(
- actual_weight,
- call_weight
- + base_weight + base_multiplier
- + named_multiplier + periodic_multiplier
- );
- assert_eq!(logger::log(), vec![(root(), 2600u32)]);
-
- // Will include anon and anon periodic
- let actual_weight = Scheduler::on_initialize(2);
- let call_weight = MaximumSchedulerWeight::get() / 2 + MaximumSchedulerWeight::get() / 3;
- assert_eq!(
- actual_weight,
- call_weight + base_weight + base_multiplier * 2 + periodic_multiplier
- );
- assert_eq!(
- logger::log(),
- vec![(root(), 2600u32), (root(), 69u32), (root(), 42u32)]
- );
-
- // Will include named only
- let actual_weight = Scheduler::on_initialize(3);
- let call_weight = MaximumSchedulerWeight::get() / 3;
- assert_eq!(
- actual_weight,
- call_weight + base_weight + base_multiplier + named_multiplier
- );
- assert_eq!(
- logger::log(),
- vec![
- (root(), 2600u32),
- (root(), 69u32),
- (root(), 42u32),
- (root(), 3u32)
- ]
- );
-
- // Will contain none
- let actual_weight = Scheduler::on_initialize(4);
- assert_eq!(actual_weight, 0);
- });
- }
-
- #[test]
- fn root_calls_works() {
- new_test_ext().execute_with(|| {
- let call = Box::new(Call::Logger(logger::Call::log(69, 1000)));
- let call2 = Box::new(Call::Logger(logger::Call::log(42, 1000)));
- assert_ok!(Scheduler::schedule_named(
- Origin::root(),
- 1u32.encode(),
- 4,
- None,
- 127,
- call
- ));
- assert_ok!(Scheduler::schedule(Origin::root(), 4, None, 127, call2));
- run_to_block(3);
- // Scheduled calls are in the agenda.
- assert_eq!(Agenda::<Test>::get(4).len(), 2);
- assert!(logger::log().is_empty());
- assert_ok!(Scheduler::cancel_named(Origin::root(), 1u32.encode()));
- assert_ok!(Scheduler::cancel(Origin::root(), 4, 1));
- // Scheduled calls are made NONE, so should not effect state
- run_to_block(100);
- assert!(logger::log().is_empty());
- });
- }
-
- #[test]
- fn fails_to_schedule_task_in_the_past() {
- new_test_ext().execute_with(|| {
- run_to_block(3);
-
- let call = Box::new(Call::Logger(logger::Call::log(69, 1000)));
- let call2 = Box::new(Call::Logger(logger::Call::log(42, 1000)));
-
- assert_err!(
- Scheduler::schedule_named(Origin::root(), 1u32.encode(), 2, None, 127, call),
- Error::<Test>::TargetBlockNumberInPast,
- );
-
- assert_err!(
- Scheduler::schedule(Origin::root(), 2, None, 127, call2.clone()),
- Error::<Test>::TargetBlockNumberInPast,
- );
-
- assert_err!(
- Scheduler::schedule(Origin::root(), 3, None, 127, call2),
- Error::<Test>::TargetBlockNumberInPast,
- );
- });
- }
-
- #[test]
- fn should_use_orign() {
- new_test_ext().execute_with(|| {
- let call = Box::new(Call::Logger(logger::Call::log(69, 1000)));
- let call2 = Box::new(Call::Logger(logger::Call::log(42, 1000)));
- assert_ok!(Scheduler::schedule_named(
- system::RawOrigin::Signed(1).into(),
- 1u32.encode(),
- 4,
- None,
- 127,
- call
- ));
- assert_ok!(Scheduler::schedule(
- system::RawOrigin::Signed(1).into(),
- 4,
- None,
- 127,
- call2
- ));
- run_to_block(3);
- // Scheduled calls are in the agenda.
- assert_eq!(Agenda::<Test>::get(4).len(), 2);
- assert!(logger::log().is_empty());
- assert_ok!(Scheduler::cancel_named(
- system::RawOrigin::Signed(1).into(),
- 1u32.encode()
- ));
- assert_ok!(Scheduler::cancel(system::RawOrigin::Signed(1).into(), 4, 1));
- // Scheduled calls are made NONE, so should not effect state
- run_to_block(100);
- assert!(logger::log().is_empty());
- });
- }
-
- #[test]
- fn should_check_orign() {
- new_test_ext().execute_with(|| {
- let call = Box::new(Call::Logger(logger::Call::log(69, 1000)));
- let call2 = Box::new(Call::Logger(logger::Call::log(42, 1000)));
- assert_noop!(
- Scheduler::schedule_named(
- system::RawOrigin::Signed(2).into(),
- 1u32.encode(),
- 4,
- None,
- 127,
- call
- ),
- BadOrigin
- );
- assert_noop!(
- Scheduler::schedule(system::RawOrigin::Signed(2).into(), 4, None, 127, call2),
- BadOrigin
- );
- });
- }
-
- #[test]
- fn should_check_orign_for_cancel() {
- new_test_ext().execute_with(|| {
- let call = Box::new(Call::Logger(logger::Call::log_without_filter(69, 1000)));
- let call2 = Box::new(Call::Logger(logger::Call::log_without_filter(42, 1000)));
- assert_ok!(Scheduler::schedule_named(
- system::RawOrigin::Signed(1).into(),
- 1u32.encode(),
- 4,
- None,
- 127,
- call
- ));
- assert_ok!(Scheduler::schedule(
- system::RawOrigin::Signed(1).into(),
- 4,
- None,
- 127,
- call2
- ));
- run_to_block(3);
- // Scheduled calls are in the agenda.
- assert_eq!(Agenda::<Test>::get(4).len(), 2);
- assert!(logger::log().is_empty());
- assert_noop!(
- Scheduler::cancel_named(system::RawOrigin::Signed(2).into(), 1u32.encode()),
- BadOrigin
- );
- assert_noop!(
- Scheduler::cancel(system::RawOrigin::Signed(2).into(), 4, 1),
- BadOrigin
- );
- assert_noop!(
- Scheduler::cancel_named(system::RawOrigin::Root.into(), 1u32.encode()),
- BadOrigin
- );
- assert_noop!(
- Scheduler::cancel(system::RawOrigin::Root.into(), 4, 1),
- BadOrigin
- );
- run_to_block(5);
- assert_eq!(
- logger::log(),
- vec![
- (system::RawOrigin::Signed(1).into(), 69u32),
- (system::RawOrigin::Signed(1).into(), 42u32)
- ]
- );
- });
- }
-
- #[test]
- fn migration_to_v2_works() {
- new_test_ext().execute_with(|| {
- for i in 0..3u64 {
- let k = i.twox_64_concat();
- let old = vec![
- Some(ScheduledV1 {
- maybe_id: None,
- priority: i as u8 + 10,
- call: Call::Logger(logger::Call::log(96, 100)),
- maybe_periodic: None,
- }),
- None,
- Some(ScheduledV1 {
- maybe_id: Some(b"test".to_vec()),
- priority: 123,
- call: Call::Logger(logger::Call::log(69, 1000)),
- maybe_periodic: Some((456u64, 10)),
- }),
- ];
- frame_support::migration::put_storage_value(b"Scheduler", b"Agenda", &k, old);
- }
-
- assert_eq!(StorageVersion::get(), Releases::V1);
-
- assert!(Scheduler::migrate_v1_to_t2());
-
- assert_eq_uvec!(
- Agenda::<Test>::iter().collect::<Vec<_>>(),
- vec![
- (
- 0,
- vec![
- Some(ScheduledV2 {
- maybe_id: None,
- priority: 10,
- call: Call::Logger(logger::Call::log(96, 100)),
- maybe_periodic: None,
- origin: root(),
- _phantom: PhantomData::<u64>::default(),
- }),
- None,
- Some(ScheduledV2 {
- maybe_id: Some(b"test".to_vec()),
- priority: 123,
- call: Call::Logger(logger::Call::log(69, 1000)),
- maybe_periodic: Some((456u64, 10)),
- origin: root(),
- _phantom: PhantomData::<u64>::default(),
- }),
- ]
- ),
- (
- 1,
- vec![
- Some(ScheduledV2 {
- maybe_id: None,
- priority: 11,
- call: Call::Logger(logger::Call::log(96, 100)),
- maybe_periodic: None,
- origin: root(),
- _phantom: PhantomData::<u64>::default(),
- }),
- None,
- Some(ScheduledV2 {
- maybe_id: Some(b"test".to_vec()),
- priority: 123,
- call: Call::Logger(logger::Call::log(69, 1000)),
- maybe_periodic: Some((456u64, 10)),
- origin: root(),
- _phantom: PhantomData::<u64>::default(),
- }),
- ]
- ),
- (
- 2,
- vec![
- Some(ScheduledV2 {
- maybe_id: None,
- priority: 12,
- call: Call::Logger(logger::Call::log(96, 100)),
- maybe_periodic: None,
- origin: root(),
- _phantom: PhantomData::<u64>::default(),
- }),
- None,
- Some(ScheduledV2 {
- maybe_id: Some(b"test".to_vec()),
- priority: 123,
- call: Call::Logger(logger::Call::log(69, 1000)),
- maybe_periodic: Some((456u64, 10)),
- origin: root(),
- _phantom: PhantomData::<u64>::default(),
- }),
- ]
- )
- ]
- );
-
- assert_eq!(StorageVersion::get(), Releases::V2);
- });
- }
-
- #[test]
- fn test_migrate_origin() {
- new_test_ext().execute_with(|| {
- for i in 0..3u64 {
- let k = i.twox_64_concat();
- let old: Vec<Option<Scheduled<_, _, u32, u64>>> = vec![
- Some(Scheduled {
- maybe_id: None,
- priority: i as u8 + 10,
- call: Call::Logger(logger::Call::log(96, 100)),
- origin: 3u32,
- maybe_periodic: None,
- _phantom: Default::default(),
- }),
- None,
- Some(Scheduled {
- maybe_id: Some(b"test".to_vec()),
- priority: 123,
- origin: 2u32,
- call: Call::Logger(logger::Call::log(69, 1000)),
- maybe_periodic: Some((456u64, 10)),
- _phantom: Default::default(),
- }),
- ];
- frame_support::migration::put_storage_value(b"Scheduler", b"Agenda", &k, old);
- }
-
- impl From<u32> for OriginCaller {
- fn from(value: u32) -> Self {
- match value {
- 3 => system::RawOrigin::Root.into(),
- 2 => system::RawOrigin::None.into(),
- _ => unimplemented!(),
- }
- }
- }
-
- Scheduler::migrate_origin::<u32>();
-
- assert_eq_uvec!(
- Agenda::<Test>::iter().collect::<Vec<_>>(),
- vec![
- (
- 0,
- vec![
- Some(ScheduledV2::<_, _, OriginCaller, u64> {
- maybe_id: None,
- priority: 10,
- call: Call::Logger(logger::Call::log(96, 100)),
- maybe_periodic: None,
- origin: system::RawOrigin::Root.into(),
- _phantom: PhantomData::<u64>::default(),
- }),
- None,
- Some(ScheduledV2 {
- maybe_id: Some(b"test".to_vec()),
- priority: 123,
- call: Call::Logger(logger::Call::log(69, 1000)),
- maybe_periodic: Some((456u64, 10)),
- origin: system::RawOrigin::None.into(),
- _phantom: PhantomData::<u64>::default(),
- }),
- ]
- ),
- (
- 1,
- vec![
- Some(ScheduledV2 {
- maybe_id: None,
- priority: 11,
- call: Call::Logger(logger::Call::log(96, 100)),
- maybe_periodic: None,
- origin: system::RawOrigin::Root.into(),
- _phantom: PhantomData::<u64>::default(),
- }),
- None,
- Some(ScheduledV2 {
- maybe_id: Some(b"test".to_vec()),
- priority: 123,
- call: Call::Logger(logger::Call::log(69, 1000)),
- maybe_periodic: Some((456u64, 10)),
- origin: system::RawOrigin::None.into(),
- _phantom: PhantomData::<u64>::default(),
- }),
- ]
- ),
- (
- 2,
- vec![
- Some(ScheduledV2 {
- maybe_id: None,
- priority: 12,
- call: Call::Logger(logger::Call::log(96, 100)),
- maybe_periodic: None,
- origin: system::RawOrigin::Root.into(),
- _phantom: PhantomData::<u64>::default(),
- }),
- None,
- Some(ScheduledV2 {
- maybe_id: Some(b"test".to_vec()),
- priority: 123,
- call: Call::Logger(logger::Call::log(69, 1000)),
- maybe_periodic: Some((456u64, 10)),
- origin: system::RawOrigin::None.into(),
- _phantom: PhantomData::<u64>::default(),
- }),
- ]
- )
- ]
- );
- });
- }
}
primitives/nft/src/lib.rsdiffbeforeafterboth--- a/primitives/nft/src/lib.rs
+++ b/primitives/nft/src/lib.rs
@@ -144,6 +144,7 @@
pub limits: CollectionLimits<T::BlockNumber>, // Collection private restrictions
pub variable_on_chain_schema: Vec<u8>, //
pub const_on_chain_schema: Vec<u8>, //
+ pub transfers_enabled: bool,
}
#[derive(Encode, Decode, Debug, Clone, PartialEq)]