difftreelog
Merge pull request #179 from UniqueNetwork/fix/update-contracts-intergration
in: master
Fix contracts intergration
16 files changed
Cargo.lockdiffbeforeafterboth--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4935,12 +4935,15 @@
name = "nft-data-structs"
version = "0.9.0"
dependencies = [
+ "derivative",
"frame-support",
"frame-system",
+ "max-encoded-len",
"parity-scale-codec",
"serde",
"sp-core",
"sp-runtime",
+ "sp-std",
]
[[package]]
@@ -4999,6 +5002,7 @@
"cumulus-primitives-core",
"cumulus-primitives-timestamp",
"cumulus-primitives-utility",
+ "derivative",
"fp-rpc",
"frame-benchmarking",
"frame-executive",
@@ -5007,6 +5011,7 @@
"frame-system-benchmarking",
"frame-system-rpc-runtime-api",
"hex-literal",
+ "max-encoded-len",
"nft-data-structs",
"pallet-aura",
"pallet-balances",
node/cli/src/chain_spec.rsdiffbeforeafterboth--- a/node/cli/src/chain_spec.rs
+++ b/node/cli/src/chain_spec.rs
@@ -202,18 +202,6 @@
nft_item_id: vec![],
fungible_item_id: vec![],
refungible_item_id: vec![],
- chain_limit: ChainLimits {
- collection_numbers_limit: 100000,
- account_token_ownership_limit: 1000000,
- collections_admins_limit: 5,
- custom_data_limit: 2048,
- nft_sponsor_transfer_timeout: 15,
- fungible_sponsor_transfer_timeout: 15,
- refungible_sponsor_transfer_timeout: 15,
- offchain_schema_limit: 1024,
- variable_on_chain_schema_limit: 1024,
- const_on_chain_schema_limit: 1024,
- },
},
parachain_info: nft_runtime::ParachainInfoConfig { parachain_id: id },
aura: nft_runtime::AuraConfig {
pallets/nft/Cargo.tomldiffbeforeafterboth--- a/pallets/nft/Cargo.toml
+++ b/pallets/nft/Cargo.toml
@@ -41,6 +41,7 @@
'evm-coder/std',
'pallet-evm-coder-substrate/std',
]
+limit-testing = ["nft-data-structs/limit-testing"]
################################################################################
# Substrate Dependencies
pallets/nft/src/default_weights.rsdiffbeforeafterboth--- a/pallets/nft/src/default_weights.rs
+++ b/pallets/nft/src/default_weights.rs
@@ -117,11 +117,6 @@
.saturating_add(DbWeight::get().reads(2_u64))
.saturating_add(DbWeight::get().writes(1_u64))
}
- fn set_chain_limits() -> Weight {
- 1_300_000_u64
- .saturating_add(DbWeight::get().reads(0_u64))
- .saturating_add(DbWeight::get().writes(1_u64))
- }
fn set_contract_sponsoring_rate_limit() -> Weight {
3_500_000_u64
.saturating_add(DbWeight::get().reads(0_u64))
pallets/nft/src/eth/sponsoring.rsdiffbeforeafterboth--- a/pallets/nft/src/eth/sponsoring.rs
+++ b/pallets/nft/src/eth/sponsoring.rs
@@ -1,12 +1,12 @@
//! Implements EVM sponsoring logic via OnChargeEVMTransaction
use crate::{
- ChainLimit, Collection, CollectionById, Config, FungibleTransferBasket, NftTransferBasket,
+ Collection, CollectionById, Config, FungibleTransferBasket, NftTransferBasket,
eth::{account::EvmBackwardsAddressMapping, map_eth_to_id},
};
use evm_coder::{Call, abi::AbiReader};
use frame_support::{
- storage::{StorageMap, StorageDoubleMap, StorageValue},
+ storage::{StorageMap, StorageDoubleMap},
};
use sp_core::H160;
use sp_std::prelude::*;
@@ -17,6 +17,7 @@
};
use core::convert::TryInto;
use core::marker::PhantomData;
+use nft_data_structs::{NFT_SPONSOR_TRANSFER_TIMEOUT, FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT};
struct AnyError;
@@ -43,7 +44,7 @@
let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {
collection_limits.sponsor_transfer_timeout
} else {
- ChainLimit::get().nft_sponsor_transfer_timeout
+ NFT_SPONSOR_TRANSFER_TIMEOUT
};
let mut sponsor = true;
@@ -74,7 +75,7 @@
let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {
collection_limits.sponsor_transfer_timeout
} else {
- ChainLimit::get().fungible_sponsor_transfer_timeout
+ FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT
};
let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
pallets/nft/src/lib.rsdiffbeforeafterboth--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -31,14 +31,16 @@
StorageValue, transactional,
};
-use frame_system::{self as system, ensure_signed, ensure_root};
+use frame_system::{self as system, ensure_signed};
use sp_core::H160;
use sp_std::vec;
use sp_runtime::sp_std::prelude::Vec;
use core::ops::{Deref, DerefMut};
use nft_data_structs::{
MAX_DECIMAL_POINTS, MAX_SPONSOR_TIMEOUT, MAX_TOKEN_OWNERSHIP, MAX_REFUNGIBLE_PIECES,
- AccessMode, ChainLimits, Collection, CreateItemData, CollectionLimits, CollectionId,
+ CUSTOM_DATA_LIMIT, COLLECTION_NUMBER_LIMIT, ACCOUNT_TOKEN_OWNERSHIP_LIMIT,
+ VARIABLE_ON_CHAIN_SCHEMA_LIMIT, CONST_ON_CHAIN_SCHEMA_LIMIT, COLLECTION_ADMINS_LIMIT,
+ OFFCHAIN_SCHEMA_LIMIT, AccessMode, Collection, CreateItemData, CollectionLimits, CollectionId,
CollectionMode, TokenId, SchemaVersion, SponsorshipState, Ownership, NftItemType,
FungibleItemType, ReFungibleItemType,
};
@@ -86,7 +88,6 @@
fn set_variable_meta_data() -> Weight;
fn enable_contract_sponsoring() -> Weight;
fn set_schema_version() -> Weight;
- fn set_chain_limits() -> Weight;
fn set_contract_sponsoring_rate_limit() -> Weight;
fn set_variable_meta_data_sponsoring_rate_limit() -> Weight;
fn toggle_contract_white_list() -> Weight;
@@ -278,10 +279,6 @@
/// Id of last collection token
/// Collection id (controlled?1)
ItemListIndex: map hasher(blake2_128_concat) CollectionId => TokenId;
- //#endregion
-
- //#region Chain limits struct
- pub ChainLimit get(fn chain_limit) config(): ChainLimits;
//#endregion
//#region Bound counters
@@ -435,6 +432,7 @@
origin: T::Origin
{
fn deposit_event() = default;
+ const CollectionAdminsLimit: u64 = COLLECTION_ADMINS_LIMIT;
type Error = Error<T>;
fn on_initialize(_now: T::BlockNumber) -> Weight {
@@ -485,14 +483,12 @@
CollectionMode::Fungible(points) => points,
_ => 0
};
-
- let chain_limit = ChainLimit::get();
let created_count = CreatedCollectionCount::get();
let destroyed_count = DestroyedCollectionCount::get();
// bound Total number of collections
- ensure!(created_count - destroyed_count < chain_limit.collection_numbers_limit, Error::<T>::TotalCollectionsLimitExceeded);
+ ensure!(created_count - destroyed_count < COLLECTION_NUMBER_LIMIT, Error::<T>::TotalCollectionsLimitExceeded);
// check params
ensure!(decimal_points <= MAX_DECIMAL_POINTS, Error::<T>::CollectionDecimalPointLimitExceeded);
@@ -508,7 +504,7 @@
CreatedCollectionCount::put(next_id);
let limits = CollectionLimits {
- sponsored_data_size: chain_limit.custom_data_limit,
+ sponsored_data_size: CUSTOM_DATA_LIMIT,
..Default::default()
};
@@ -737,8 +733,7 @@
match admin_arr.binary_search(&new_admin_id) {
Ok(_) => {},
Err(idx) => {
- let limits = ChainLimit::get();
- ensure!(admin_arr.len() < limits.collections_admins_limit as usize, Error::<T>::CollectionAdminsLimitExceeded);
+ ensure!(admin_arr.len() < COLLECTION_ADMINS_LIMIT as usize, Error::<T>::CollectionAdminsLimitExceeded);
admin_arr.insert(idx, new_admin_id);
<AdminList<T>>::insert(collection_id, admin_arr);
}
@@ -1138,7 +1133,7 @@
Self::check_owner_or_admin_permissions(&target_collection, &sender)?;
// check schema limit
- ensure!(schema.len() as u32 <= ChainLimit::get().offchain_schema_limit, "");
+ ensure!(schema.len() as u32 <= OFFCHAIN_SCHEMA_LIMIT, "");
target_collection.offchain_schema = schema;
target_collection.save()
@@ -1168,7 +1163,7 @@
Self::check_owner_or_admin_permissions(&target_collection, &sender)?;
// check schema limit
- ensure!(schema.len() as u32 <= ChainLimit::get().const_on_chain_schema_limit, "");
+ ensure!(schema.len() as u32 <= CONST_ON_CHAIN_SCHEMA_LIMIT, "");
target_collection.const_on_chain_schema = schema;
target_collection.save()
@@ -1198,25 +1193,10 @@
Self::check_owner_or_admin_permissions(&target_collection, &sender)?;
// check schema limit
- ensure!(schema.len() as u32 <= ChainLimit::get().variable_on_chain_schema_limit, "");
+ ensure!(schema.len() as u32 <= VARIABLE_ON_CHAIN_SCHEMA_LIMIT, "");
target_collection.variable_on_chain_schema = schema;
target_collection.save()
- }
-
- // Sudo permissions function
- #[weight = <T as Config>::WeightInfo::set_chain_limits()]
- #[transactional]
- pub fn set_chain_limits(
- origin,
- limits: ChainLimits
- ) -> DispatchResult {
-
- #[cfg(not(feature = "runtime-benchmarks"))]
- ensure_root(origin)?;
-
- <ChainLimit>::put(limits);
- Ok(())
}
#[weight = <T as Config>::WeightInfo::set_collection_limits()]
@@ -1230,12 +1210,11 @@
let mut target_collection = Self::get_collection(collection_id)?;
Self::check_owner_permissions(&target_collection, sender.as_sub())?;
let old_limits = &target_collection.limits;
- let chain_limits = ChainLimit::get();
// collection bounds
ensure!(new_limits.sponsor_transfer_timeout <= MAX_SPONSOR_TIMEOUT &&
new_limits.account_token_ownership_limit <= MAX_TOKEN_OWNERSHIP &&
- new_limits.sponsored_data_size <= chain_limits.custom_data_limit,
+ new_limits.sponsored_data_size <= CUSTOM_DATA_LIMIT,
Error::<T>::CollectionLimitBoundsExceeded);
// token_limit check prev
@@ -1471,7 +1450,7 @@
Self::token_exists(collection, item_id)?;
ensure!(
- ChainLimit::get().custom_data_limit >= data.len() as u32,
+ CUSTOM_DATA_LIMIT >= data.len() as u32,
Error::<T>::TokenVariableDataLimitExceeded
);
@@ -1616,38 +1595,17 @@
) -> DispatchResult {
match target_collection.mode {
CollectionMode::NFT => {
- if let CreateItemData::NFT(data) = data {
- // check sizes
- ensure!(
- ChainLimit::get().custom_data_limit >= data.const_data.len() as u32,
- Error::<T>::TokenConstDataLimitExceeded
- );
- ensure!(
- ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32,
- Error::<T>::TokenVariableDataLimitExceeded
- );
- } else {
+ if !matches!(data, CreateItemData::NFT(_)) {
fail!(Error::<T>::NotNftDataUsedToMintNftCollectionToken);
}
}
CollectionMode::Fungible(_) => {
- if let CreateItemData::Fungible(_) = data {
- } else {
+ if !matches!(data, CreateItemData::Fungible(_)) {
fail!(Error::<T>::NotFungibleDataUsedToMintFungibleCollectionToken);
}
}
CollectionMode::ReFungible => {
if let CreateItemData::ReFungible(data) = data {
- // check sizes
- ensure!(
- ChainLimit::get().custom_data_limit >= data.const_data.len() as u32,
- Error::<T>::TokenConstDataLimitExceeded
- );
- ensure!(
- ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32,
- Error::<T>::TokenVariableDataLimitExceeded
- );
-
// Check refungibility limits
ensure!(
data.pieces <= MAX_REFUNGIBLE_PIECES,
@@ -1675,8 +1633,8 @@
CreateItemData::NFT(data) => {
let item = NftItemType {
owner: owner.clone(),
- const_data: data.const_data,
- variable_data: data.variable_data,
+ const_data: data.const_data.into_inner(),
+ variable_data: data.variable_data.into_inner(),
};
Self::add_nft_item(collection, item)?;
@@ -1692,8 +1650,8 @@
let item = ReFungibleItemType {
owner: owner_list,
- const_data: data.const_data,
- variable_data: data.variable_data,
+ const_data: data.const_data.into_inner(),
+ variable_data: data.variable_data.into_inner(),
};
Self::add_refungible_item(collection, item)?;
@@ -2292,7 +2250,7 @@
// bound Owned tokens by a single address
let count = <AccountItemCount<T>>::get(owner.as_sub());
ensure!(
- count < ChainLimit::get().account_token_ownership_limit,
+ count < ACCOUNT_TOKEN_OWNERSHIP_LIMIT,
Error::<T>::AddressOwnershipLimitExceeded
);
pallets/nft/src/sponsorship.rsdiffbeforeafterboth--- a/pallets/nft/src/sponsorship.rs
+++ b/pallets/nft/src/sponsorship.rs
@@ -1,15 +1,18 @@
use crate::{
Config, Call, CollectionById, CreateItemBasket, VariableMetaDataBasket,
- ReFungibleTransferBasket, FungibleTransferBasket, NftTransferBasket, ChainLimit,
- CreateItemData, CollectionMode,
+ ReFungibleTransferBasket, FungibleTransferBasket, NftTransferBasket, CreateItemData,
+ CollectionMode,
};
use core::marker::PhantomData;
use up_sponsorship::SponsorshipHandler;
use frame_support::{
- traits::IsSubType,
- storage::{StorageMap, StorageDoubleMap, StorageValue},
+ traits::{IsSubType},
+ storage::{StorageMap, StorageDoubleMap},
+};
+use nft_data_structs::{
+ TokenId, CollectionId, NFT_SPONSOR_TRANSFER_TIMEOUT, REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,
+ FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,
};
-use nft_data_structs::{TokenId, CollectionId};
pub struct NftSponsorshipHandler<T>(PhantomData<T>);
impl<T: Config> NftSponsorshipHandler<T> {
@@ -47,7 +50,6 @@
item_id: &TokenId,
) -> Option<T::AccountId> {
let collection = CollectionById::<T>::get(collection_id)?;
- let limits = ChainLimit::get();
let mut sponsor_transfer = false;
if collection.sponsorship.confirmed() {
@@ -62,7 +64,7 @@
let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {
collection_limits.sponsor_transfer_timeout
} else {
- limits.nft_sponsor_transfer_timeout
+ NFT_SPONSOR_TRANSFER_TIMEOUT
};
let mut sponsored = true;
@@ -84,7 +86,7 @@
let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {
collection_limits.sponsor_transfer_timeout
} else {
- limits.fungible_sponsor_transfer_timeout
+ FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT
};
let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
@@ -107,7 +109,7 @@
let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {
collection_limits.sponsor_transfer_timeout
} else {
- limits.refungible_sponsor_transfer_timeout
+ REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT
};
let mut sponsored = true;
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}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(2391 origin1, 1, false2392 ));23932394 let data = default_nft_data();2395 create_test_item(collection_id, &data.into());2396 assert_eq!(TemplateModule::balance_count(1, 1), 1);2397 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);23982399 let origin1 = Origin::signed(1);24002401 // default scenario2402 assert_noop!(2403 TemplateModule::transfer(origin1, account(2), 1, 1, 1000),2404 Error::<Test>::TransferNotAllowed2405 );2406 assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(1));2407 assert_eq!(TemplateModule::balance_count(1, 1), 1);2408 assert_eq!(TemplateModule::balance_count(1, 2), 0);24092410 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);2411 });2412}1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode, Ownership, CreateItemData};5use nft_data_structs::{6 CreateNftData, CreateFungibleData, CreateReFungibleData, CollectionId, TokenId,7 MAX_DECIMAL_POINTS,8};9use frame_support::{assert_noop, assert_ok};10use sp_std::convert::TryInto;1112fn default_nft_data() -> CreateNftData {13 CreateNftData {14 const_data: vec![1, 2, 3].try_into().unwrap(),15 variable_data: vec![3, 2, 1].try_into().unwrap(),16 }17}1819fn default_fungible_data() -> CreateFungibleData {20 CreateFungibleData { value: 5 }21}2223fn default_re_fungible_data() -> CreateReFungibleData {24 CreateReFungibleData {25 const_data: vec![1, 2, 3].try_into().unwrap(),26 variable_data: vec![3, 2, 1].try_into().unwrap(),27 pieces: 1023,28 }29}3031fn create_test_collection_for_owner(32 mode: &CollectionMode,33 owner: u64,34 id: CollectionId,35) -> CollectionId {36 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();37 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();38 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();3940 let origin1 = Origin::signed(owner);41 assert_ok!(TemplateModule::create_collection(42 origin1,43 col_name1,44 col_desc1,45 token_prefix1,46 mode.clone()47 ));4849 let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();50 let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();51 let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();52 assert_eq!(TemplateModule::collection_id(id).unwrap().owner, owner);53 assert_eq!(54 TemplateModule::collection_id(id).unwrap().name,55 saved_col_name56 );57 assert_eq!(TemplateModule::collection_id(id).unwrap().mode, *mode);58 assert_eq!(59 TemplateModule::collection_id(id).unwrap().description,60 saved_description61 );62 assert_eq!(63 TemplateModule::collection_id(id).unwrap().token_prefix,64 saved_prefix65 );66 id67}6869fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {70 create_test_collection_for_owner(&mode, 1, id)71}7273fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {74 let origin1 = Origin::signed(1);75 assert_ok!(TemplateModule::create_item(76 origin1,77 collection_id,78 account(1),79 data.clone()80 ));81}8283fn account(sub: u64) -> TestCrossAccountId {84 TestCrossAccountId::from_sub(sub)85}8687// Use cases tests region88// #region8990#[test]91fn set_version_schema() {92 new_test_ext().execute_with(|| {93 let origin1 = Origin::signed(1);94 let collection_id = create_test_collection(&CollectionMode::NFT, 1);9596 assert_ok!(TemplateModule::set_schema_version(97 origin1,98 collection_id,99 SchemaVersion::Unique100 ));101 assert_eq!(102 TemplateModule::collection_id(collection_id)103 .unwrap()104 .schema_version,105 SchemaVersion::Unique106 );107 });108}109110#[test]111fn create_fungible_collection_fails_with_large_decimal_numbers() {112 new_test_ext().execute_with(|| {113 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();114 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();115 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();116117 let origin1 = Origin::signed(1);118 assert_noop!(119 TemplateModule::create_collection(120 origin1,121 col_name1,122 col_desc1,123 token_prefix1,124 CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)125 ),126 Error::<Test>::CollectionDecimalPointLimitExceeded127 );128 });129}130131#[test]132fn create_nft_item() {133 new_test_ext().execute_with(|| {134 let collection_id = create_test_collection(&CollectionMode::NFT, 1);135136 let data = default_nft_data();137 create_test_item(collection_id, &data.clone().into());138 let item = TemplateModule::nft_item_id(collection_id, 1).unwrap();139 assert_eq!(item.const_data, data.const_data.into_inner());140 assert_eq!(item.variable_data, data.variable_data.into_inner());141 });142}143144// Use cases tests region145// #region146#[test]147fn create_nft_multiple_items() {148 new_test_ext().execute_with(|| {149 create_test_collection(&CollectionMode::NFT, 1);150151 let origin1 = Origin::signed(1);152153 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];154155 assert_ok!(TemplateModule::create_multiple_items(156 origin1,157 1,158 account(1),159 items_data160 .clone()161 .into_iter()162 .map(|d| { d.into() })163 .collect()164 ));165 for (index, data) in items_data.into_iter().enumerate() {166 let item = TemplateModule::nft_item_id(1, (index + 1) as TokenId).unwrap();167 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());168 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());169 }170 });171}172173#[test]174fn create_refungible_item() {175 new_test_ext().execute_with(|| {176 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);177178 let data = default_re_fungible_data();179 create_test_item(collection_id, &data.clone().into());180 let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();181 assert_eq!(item.const_data, data.const_data.into_inner());182 assert_eq!(item.variable_data, data.variable_data.into_inner());183 assert_eq!(184 item.owner[0],185 Ownership {186 owner: account(1),187 fraction: 1023188 }189 );190 });191}192193#[test]194fn create_multiple_refungible_items() {195 new_test_ext().execute_with(|| {196 create_test_collection(&CollectionMode::ReFungible, 1);197198 let origin1 = Origin::signed(1);199200 let items_data = vec![201 default_re_fungible_data(),202 default_re_fungible_data(),203 default_re_fungible_data(),204 ];205206 assert_ok!(TemplateModule::create_multiple_items(207 origin1,208 1,209 account(1),210 items_data211 .clone()212 .into_iter()213 .map(|d| { d.into() })214 .collect()215 ));216 for (index, data) in items_data.into_iter().enumerate() {217 let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId).unwrap();218 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());219 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());220 assert_eq!(221 item.owner[0],222 Ownership {223 owner: account(1),224 fraction: 1023225 }226 );227 }228 });229}230231#[test]232fn create_fungible_item() {233 new_test_ext().execute_with(|| {234 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);235236 let data = default_fungible_data();237 create_test_item(collection_id, &data.into());238239 assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).value, 5);240 });241}242243//#[test]244// fn create_multiple_fungible_items() {245// new_test_ext().execute_with(|| {246// default_limits();247248// create_test_collection(&CollectionMode::Fungible(3), 1);249250// let origin1 = Origin::signed(1);251252// let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];253254// assert_ok!(TemplateModule::create_multiple_items(255// origin1.clone(),256// 1,257// 1,258// items_data.clone().into_iter().map(|d| { d.into() }).collect()259// ));260261// for (index, _) in items_data.iter().enumerate() {262// assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);263// }264// assert_eq!(TemplateModule::balance_count(1, 1), 3000);265// assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);266// });267// }268269#[test]270fn transfer_fungible_item() {271 new_test_ext().execute_with(|| {272 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);273274 let origin1 = Origin::signed(1);275 let origin2 = Origin::signed(2);276277 let data = default_fungible_data();278 create_test_item(collection_id, &data.into());279280 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 5);281 assert_eq!(TemplateModule::balance_count(1, 1), 5);282283 // change owner scenario284 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 5));285 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 0);286 assert_eq!(TemplateModule::balance_count(1, 1), 0);287 assert_eq!(TemplateModule::balance_count(1, 2), 5);288289 // split item scenario290 assert_ok!(TemplateModule::transfer(291 origin2.clone(),292 account(3),293 1,294 1,295 3296 ));297 assert_eq!(TemplateModule::balance_count(1, 2), 2);298 assert_eq!(TemplateModule::balance_count(1, 3), 3);299300 // split item and new owner has account scenario301 assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 1));302 assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 1);303 assert_eq!(TemplateModule::fungible_item_id(1, 3).value, 4);304 assert_eq!(TemplateModule::balance_count(1, 2), 1);305 assert_eq!(TemplateModule::balance_count(1, 3), 4);306 });307}308309#[test]310fn transfer_refungible_item() {311 new_test_ext().execute_with(|| {312 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);313314 let data = default_re_fungible_data();315 create_test_item(collection_id, &data.clone().into());316317 let origin1 = Origin::signed(1);318 let origin2 = Origin::signed(2);319 {320 let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();321 assert_eq!(item.const_data, data.const_data.into_inner());322 assert_eq!(item.variable_data, data.variable_data.into_inner());323 assert_eq!(324 item.owner[0],325 Ownership {326 owner: account(1),327 fraction: 1023328 }329 );330 }331 assert_eq!(TemplateModule::balance_count(1, 1), 1023);332 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);333334 // change owner scenario335 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1023));336 assert_eq!(337 TemplateModule::refungible_item_id(1, 1).unwrap().owner[0],338 Ownership {339 owner: account(2),340 fraction: 1023341 }342 );343 assert_eq!(TemplateModule::balance_count(1, 1), 0);344 assert_eq!(TemplateModule::balance_count(1, 2), 1023);345 // assert_eq!(TemplateModule::address_tokens(1, 1), []);346 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);347348 // split item scenario349 assert_ok!(TemplateModule::transfer(350 origin2.clone(),351 account(3),352 1,353 1,354 500355 ));356 {357 let item = TemplateModule::refungible_item_id(1, 1).unwrap();358 assert_eq!(359 item.owner[0],360 Ownership {361 owner: account(2),362 fraction: 523363 }364 );365 assert_eq!(366 item.owner[1],367 Ownership {368 owner: account(3),369 fraction: 500370 }371 );372 }373 assert_eq!(TemplateModule::balance_count(1, 2), 523);374 assert_eq!(TemplateModule::balance_count(1, 3), 500);375 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);376 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);377378 // split item and new owner has account scenario379 assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 200));380 {381 let item = TemplateModule::refungible_item_id(1, 1).unwrap();382 assert_eq!(383 item.owner[0],384 Ownership {385 owner: account(2),386 fraction: 323387 }388 );389 assert_eq!(390 item.owner[1],391 Ownership {392 owner: account(3),393 fraction: 700394 }395 );396 }397 assert_eq!(TemplateModule::balance_count(1, 2), 323);398 assert_eq!(TemplateModule::balance_count(1, 3), 700);399 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);400 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);401 });402}403404#[test]405fn transfer_nft_item() {406 new_test_ext().execute_with(|| {407 let collection_id = create_test_collection(&CollectionMode::NFT, 1);408409 let data = default_nft_data();410 create_test_item(collection_id, &data.into());411 assert_eq!(TemplateModule::balance_count(1, 1), 1);412 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);413414 let origin1 = Origin::signed(1);415 // default scenario416 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1000));417 assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(2));418 assert_eq!(TemplateModule::balance_count(1, 1), 0);419 assert_eq!(TemplateModule::balance_count(1, 2), 1);420 // assert_eq!(TemplateModule::address_tokens(1, 1), []);421 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);422 });423}424425#[test]426fn nft_approve_and_transfer_from() {427 new_test_ext().execute_with(|| {428 let collection_id = create_test_collection(&CollectionMode::NFT, 1);429430 let data = default_nft_data();431 create_test_item(collection_id, &data.into());432433 let origin1 = Origin::signed(1);434 let origin2 = Origin::signed(2);435436 assert_eq!(TemplateModule::balance_count(1, 1), 1);437 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);438439 // neg transfer440 assert_noop!(441 TemplateModule::transfer_from(origin2.clone(), account(1), account(2), 1, 1, 1),442 Error::<Test>::NoPermission443 );444445 // do approve446 assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 5));447 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);448 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);449450 assert_ok!(TemplateModule::transfer_from(451 origin2,452 account(1),453 account(3),454 1,455 1,456 1457 ));458 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);459 });460}461462#[test]463fn nft_approve_and_transfer_from_white_list() {464 new_test_ext().execute_with(|| {465 let collection_id = create_test_collection(&CollectionMode::NFT, 1);466467 let origin1 = Origin::signed(1);468 let origin2 = Origin::signed(2);469470 let data = default_nft_data();471 create_test_item(collection_id, &data.clone().into());472473 assert_eq!(474 &TemplateModule::nft_item_id(1, 1).unwrap().const_data,475 &data.const_data.into_inner()476 );477 assert_eq!(TemplateModule::balance_count(1, 1), 1);478 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);479480 assert_ok!(TemplateModule::set_mint_permission(481 origin1.clone(),482 1,483 true484 ));485 assert_ok!(TemplateModule::set_public_access_mode(486 origin1.clone(),487 1,488 AccessMode::WhiteList489 ));490 assert_ok!(TemplateModule::add_to_white_list(491 origin1.clone(),492 1,493 account(1)494 ));495 assert_ok!(TemplateModule::add_to_white_list(496 origin1.clone(),497 1,498 account(2)499 ));500 assert_ok!(TemplateModule::add_to_white_list(501 origin1.clone(),502 1,503 account(3)504 ));505506 // do approve507 assert_ok!(TemplateModule::approve(508 origin1.clone(),509 account(2),510 1,511 1,512 5513 ));514 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);515 assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));516 assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);517518 assert_ok!(TemplateModule::transfer_from(519 origin2,520 account(1),521 account(3),522 1,523 1,524 1525 ));526 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);527 });528}529530#[test]531fn refungible_approve_and_transfer_from() {532 new_test_ext().execute_with(|| {533 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);534535 let origin1 = Origin::signed(1);536 let origin2 = Origin::signed(2);537538 let data = default_re_fungible_data();539 create_test_item(collection_id, &data.into());540541 assert_eq!(TemplateModule::balance_count(1, 1), 1023);542 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);543544 assert_ok!(TemplateModule::set_mint_permission(545 origin1.clone(),546 1,547 true548 ));549 assert_ok!(TemplateModule::set_public_access_mode(550 origin1.clone(),551 1,552 AccessMode::WhiteList553 ));554 assert_ok!(TemplateModule::add_to_white_list(555 origin1.clone(),556 1,557 account(1)558 ));559 assert_ok!(TemplateModule::add_to_white_list(560 origin1.clone(),561 1,562 account(2)563 ));564 assert_ok!(TemplateModule::add_to_white_list(565 origin1.clone(),566 1,567 account(3)568 ));569570 // do approve571 assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1023));572 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1023);573574 assert_ok!(TemplateModule::transfer_from(575 origin2,576 account(1),577 account(3),578 1,579 1,580 100581 ));582 assert_eq!(TemplateModule::balance_count(1, 1), 923);583 assert_eq!(TemplateModule::balance_count(1, 3), 100);584 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);585 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);586587 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 923);588 });589}590591#[test]592fn fungible_approve_and_transfer_from() {593 new_test_ext().execute_with(|| {594 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);595596 let data = default_fungible_data();597 create_test_item(collection_id, &data.into());598599 let origin1 = Origin::signed(1);600 let origin2 = Origin::signed(2);601602 assert_eq!(TemplateModule::balance_count(1, 1), 5);603604 assert_ok!(TemplateModule::set_mint_permission(605 origin1.clone(),606 1,607 true608 ));609 assert_ok!(TemplateModule::set_public_access_mode(610 origin1.clone(),611 1,612 AccessMode::WhiteList613 ));614 assert_ok!(TemplateModule::add_to_white_list(615 origin1.clone(),616 1,617 account(1)618 ));619 assert_ok!(TemplateModule::add_to_white_list(620 origin1.clone(),621 1,622 account(2)623 ));624 assert_ok!(TemplateModule::add_to_white_list(625 origin1.clone(),626 1,627 account(3)628 ));629630 // do approve631 assert_ok!(TemplateModule::approve(632 origin1.clone(),633 account(2),634 1,635 1,636 5637 ));638 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);639 assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));640 assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);641 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);642643 assert_ok!(TemplateModule::transfer_from(644 origin2.clone(),645 account(1),646 account(3),647 1,648 1,649 4650 ));651 assert_eq!(TemplateModule::balance_count(1, 1), 1);652 assert_eq!(TemplateModule::balance_count(1, 3), 4);653654 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);655656 assert_noop!(657 TemplateModule::transfer_from(origin2, account(1), account(3), 1, 1, 4),658 Error::<Test>::NoPermission659 );660 });661}662663#[test]664fn change_collection_owner() {665 new_test_ext().execute_with(|| {666 let collection_id = create_test_collection(&CollectionMode::NFT, 1);667668 let origin1 = Origin::signed(1);669 assert_ok!(TemplateModule::change_collection_owner(670 origin1,671 collection_id,672 2673 ));674 assert_eq!(675 TemplateModule::collection_id(collection_id).unwrap().owner,676 2677 );678 });679}680681#[test]682fn destroy_collection() {683 new_test_ext().execute_with(|| {684 let collection_id = create_test_collection(&CollectionMode::NFT, 1);685686 let origin1 = Origin::signed(1);687 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));688 });689}690691#[test]692fn burn_nft_item() {693 new_test_ext().execute_with(|| {694 let collection_id = create_test_collection(&CollectionMode::NFT, 1);695696 let origin1 = Origin::signed(1);697 assert_ok!(TemplateModule::add_collection_admin(698 origin1.clone(),699 collection_id,700 account(2)701 ));702703 let data = default_nft_data();704 create_test_item(collection_id, &data.into());705706 // check balance (collection with id = 1, user id = 1)707 assert_eq!(TemplateModule::balance_count(1, 1), 1);708709 // burn item710 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 5));711 assert_noop!(712 TemplateModule::burn_item(origin1, 1, 1, 5),713 Error::<Test>::TokenNotFound714 );715716 assert_eq!(TemplateModule::balance_count(1, 1), 0);717 });718}719720#[test]721fn burn_fungible_item() {722 new_test_ext().execute_with(|| {723 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);724725 let origin1 = Origin::signed(1);726 assert_ok!(TemplateModule::add_collection_admin(727 origin1.clone(),728 collection_id,729 account(2)730 ));731732 let data = default_fungible_data();733 create_test_item(collection_id, &data.into());734735 // check balance (collection with id = 1, user id = 1)736 assert_eq!(TemplateModule::balance_count(1, 1), 5);737738 // burn item739 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 5));740 assert_noop!(741 TemplateModule::burn_item(origin1, 1, 1, 5),742 Error::<Test>::TokenValueNotEnough743 );744745 assert_eq!(TemplateModule::balance_count(1, 1), 0);746 });747}748749#[test]750fn burn_refungible_item() {751 new_test_ext().execute_with(|| {752 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);753 let origin1 = Origin::signed(1);754755 assert_ok!(TemplateModule::set_mint_permission(756 origin1.clone(),757 collection_id,758 true759 ));760 assert_ok!(TemplateModule::set_public_access_mode(761 origin1.clone(),762 collection_id,763 AccessMode::WhiteList764 ));765 assert_ok!(TemplateModule::add_to_white_list(766 origin1.clone(),767 1,768 account(1)769 ));770771 assert_ok!(TemplateModule::add_collection_admin(772 origin1.clone(),773 1,774 account(2)775 ));776777 let data = default_re_fungible_data();778 create_test_item(collection_id, &data.into());779780 // check balance (collection with id = 1, user id = 2)781 assert_eq!(TemplateModule::balance_count(1, 1), 1023);782783 // burn item784 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 1023));785 assert_noop!(786 TemplateModule::burn_item(origin1, 1, 1, 1023),787 Error::<Test>::TokenNotFound788 );789790 assert_eq!(TemplateModule::balance_count(1, 1), 0);791 });792}793794#[test]795fn add_collection_admin() {796 new_test_ext().execute_with(|| {797 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);798 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);799 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);800801 let origin1 = Origin::signed(1);802803 // collection admin804 assert_ok!(TemplateModule::add_collection_admin(805 origin1.clone(),806 collection1_id,807 account(2)808 ));809 assert_ok!(TemplateModule::add_collection_admin(810 origin1,811 collection1_id,812 account(3)813 ));814815 assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(2)),);816 assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(3)),);817 });818}819820#[test]821fn remove_collection_admin() {822 new_test_ext().execute_with(|| {823 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);824 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);825 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);826827 let origin1 = Origin::signed(1);828 let origin2 = Origin::signed(2);829830 // collection admin831 assert_ok!(TemplateModule::add_collection_admin(832 origin1.clone(),833 collection1_id,834 account(2)835 ));836 assert_ok!(TemplateModule::add_collection_admin(837 origin1,838 collection1_id,839 account(3)840 ));841842 assert!(TemplateModule::admin_list_collection(1).contains(&account(2)),);843 assert!(TemplateModule::admin_list_collection(1).contains(&account(3)),);844845 // remove admin846 assert_ok!(TemplateModule::remove_collection_admin(847 origin2,848 1,849 account(3)850 ));851 assert!(!TemplateModule::admin_list_collection(1).contains(&account(3)),);852 });853}854855#[test]856fn balance_of() {857 new_test_ext().execute_with(|| {858 let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);859 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);860 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, 3);861862 // check balance before863 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);864 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);865 assert_eq!(866 TemplateModule::balance_count(re_fungible_collection_id, 1),867 0868 );869870 let nft_data = default_nft_data();871 create_test_item(nft_collection_id, &nft_data.into());872873 let fungible_data = default_fungible_data();874 create_test_item(fungible_collection_id, &fungible_data.into());875876 let re_fungible_data = default_re_fungible_data();877 create_test_item(re_fungible_collection_id, &re_fungible_data.into());878879 // check balance (collection with id = 1, user id = 1)880 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);881 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 5);882 assert_eq!(883 TemplateModule::balance_count(re_fungible_collection_id, 1),884 1023885 );886 assert_eq!(887 TemplateModule::nft_item_id(nft_collection_id, 1)888 .unwrap()889 .owner,890 account(1)891 );892 assert_eq!(893 TemplateModule::fungible_item_id(fungible_collection_id, 1).value,894 5895 );896 assert_eq!(897 TemplateModule::refungible_item_id(re_fungible_collection_id, 1)898 .unwrap()899 .owner[0]900 .owner,901 account(1)902 );903 });904}905906#[test]907fn approve() {908 new_test_ext().execute_with(|| {909 let collection_id = create_test_collection(&CollectionMode::NFT, 1);910911 let data = default_nft_data();912 create_test_item(collection_id, &data.into());913914 let origin1 = Origin::signed(1);915916 // approve917 assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1));918 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);919 });920}921922#[test]923fn transfer_from() {924 new_test_ext().execute_with(|| {925 let collection_id = create_test_collection(&CollectionMode::NFT, 1);926 let origin1 = Origin::signed(1);927 let origin2 = Origin::signed(2);928929 let data = default_nft_data();930 create_test_item(collection_id, &data.into());931932 // approve933 assert_ok!(TemplateModule::approve(934 origin1.clone(),935 account(2),936 1,937 1,938 1939 ));940 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);941942 assert_ok!(TemplateModule::set_mint_permission(943 origin1.clone(),944 1,945 true946 ));947 assert_ok!(TemplateModule::set_public_access_mode(948 origin1.clone(),949 1,950 AccessMode::WhiteList951 ));952 assert_ok!(TemplateModule::add_to_white_list(953 origin1.clone(),954 1,955 account(1)956 ));957 assert_ok!(TemplateModule::add_to_white_list(958 origin1.clone(),959 1,960 account(2)961 ));962 assert_ok!(TemplateModule::add_to_white_list(origin1, 1, account(3)));963964 assert_ok!(TemplateModule::transfer_from(965 origin2,966 account(1),967 account(2),968 1,969 1,970 1971 ));972973 // after transfer974 assert_eq!(TemplateModule::balance_count(1, 1), 0);975 assert_eq!(TemplateModule::balance_count(1, 2), 1);976 });977}978979// #endregion980981// Coverage tests region982// #region983984#[test]985fn owner_can_add_address_to_white_list() {986 new_test_ext().execute_with(|| {987 let collection_id = create_test_collection(&CollectionMode::NFT, 1);988989 let origin1 = Origin::signed(1);990 assert_ok!(TemplateModule::add_to_white_list(991 origin1,992 collection_id,993 account(2)994 ));995 assert!(TemplateModule::white_list(collection_id, 2));996 });997}998999#[test]1000fn admin_can_add_address_to_white_list() {1001 new_test_ext().execute_with(|| {1002 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1003 let origin1 = Origin::signed(1);1004 let origin2 = Origin::signed(2);10051006 assert_ok!(TemplateModule::add_collection_admin(1007 origin1,1008 collection_id,1009 account(2)1010 ));1011 assert_ok!(TemplateModule::add_to_white_list(1012 origin2,1013 collection_id,1014 account(3)1015 ));1016 assert!(TemplateModule::white_list(collection_id, 3));1017 });1018}10191020#[test]1021fn nonprivileged_user_cannot_add_address_to_white_list() {1022 new_test_ext().execute_with(|| {1023 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10241025 let origin2 = Origin::signed(2);1026 assert_noop!(1027 TemplateModule::add_to_white_list(origin2, collection_id, account(3)),1028 Error::<Test>::NoPermission1029 );1030 });1031}10321033#[test]1034fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {1035 new_test_ext().execute_with(|| {1036 let origin1 = Origin::signed(1);10371038 assert_noop!(1039 TemplateModule::add_to_white_list(origin1, 1, account(2)),1040 Error::<Test>::CollectionNotFound1041 );1042 });1043}10441045#[test]1046fn nobody_can_add_address_to_white_list_of_deleted_collection() {1047 new_test_ext().execute_with(|| {1048 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10491050 let origin1 = Origin::signed(1);1051 assert_ok!(TemplateModule::destroy_collection(1052 origin1.clone(),1053 collection_id1054 ));1055 assert_noop!(1056 TemplateModule::add_to_white_list(origin1, collection_id, account(2)),1057 Error::<Test>::CollectionNotFound1058 );1059 });1060}10611062// If address is already added to white list, nothing happens1063#[test]1064fn address_is_already_added_to_white_list() {1065 new_test_ext().execute_with(|| {1066 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1067 let origin1 = Origin::signed(1);10681069 assert_ok!(TemplateModule::add_to_white_list(1070 origin1.clone(),1071 collection_id,1072 account(2)1073 ));1074 assert_ok!(TemplateModule::add_to_white_list(1075 origin1,1076 collection_id,1077 account(2)1078 ));1079 assert!(TemplateModule::white_list(collection_id, 2));1080 });1081}10821083#[test]1084fn owner_can_remove_address_from_white_list() {1085 new_test_ext().execute_with(|| {1086 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10871088 let origin1 = Origin::signed(1);1089 assert_ok!(TemplateModule::add_to_white_list(1090 origin1.clone(),1091 collection_id,1092 account(2)1093 ));1094 assert_ok!(TemplateModule::remove_from_white_list(1095 origin1,1096 collection_id,1097 account(2)1098 ));1099 assert!(!TemplateModule::white_list(collection_id, 2));1100 });1101}11021103#[test]1104fn admin_can_remove_address_from_white_list() {1105 new_test_ext().execute_with(|| {1106 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1107 let origin1 = Origin::signed(1);1108 let origin2 = Origin::signed(2);11091110 assert_ok!(TemplateModule::add_collection_admin(1111 origin1.clone(),1112 collection_id,1113 account(2)1114 ));11151116 assert_ok!(TemplateModule::add_to_white_list(1117 origin1,1118 collection_id,1119 account(3)1120 ));1121 assert_ok!(TemplateModule::remove_from_white_list(1122 origin2,1123 collection_id,1124 account(3)1125 ));1126 assert!(!TemplateModule::white_list(collection_id, 3));1127 });1128}11291130#[test]1131fn nonprivileged_user_cannot_remove_address_from_white_list() {1132 new_test_ext().execute_with(|| {1133 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1134 let origin1 = Origin::signed(1);1135 let origin2 = Origin::signed(2);11361137 assert_ok!(TemplateModule::add_to_white_list(1138 origin1,1139 collection_id,1140 account(2)1141 ));1142 assert_noop!(1143 TemplateModule::remove_from_white_list(origin2, collection_id, account(2)),1144 Error::<Test>::NoPermission1145 );1146 assert!(TemplateModule::white_list(collection_id, 2));1147 });1148}11491150#[test]1151fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1152 new_test_ext().execute_with(|| {1153 let origin1 = Origin::signed(1);11541155 assert_noop!(1156 TemplateModule::remove_from_white_list(origin1, 1, account(2)),1157 Error::<Test>::CollectionNotFound1158 );1159 });1160}11611162#[test]1163fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1164 new_test_ext().execute_with(|| {1165 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1166 let origin1 = Origin::signed(1);1167 let origin2 = Origin::signed(2);11681169 assert_ok!(TemplateModule::add_to_white_list(1170 origin1.clone(),1171 collection_id,1172 account(2)1173 ));1174 assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));1175 assert_noop!(1176 TemplateModule::remove_from_white_list(origin2, collection_id, account(2)),1177 Error::<Test>::CollectionNotFound1178 );1179 assert!(!TemplateModule::white_list(collection_id, 2));1180 });1181}11821183// If address is already removed from white list, nothing happens1184#[test]1185fn address_is_already_removed_from_white_list() {1186 new_test_ext().execute_with(|| {1187 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1188 let origin1 = Origin::signed(1);11891190 assert_ok!(TemplateModule::add_to_white_list(1191 origin1.clone(),1192 collection_id,1193 account(2)1194 ));1195 assert_ok!(TemplateModule::remove_from_white_list(1196 origin1.clone(),1197 collection_id,1198 account(2)1199 ));1200 assert_ok!(TemplateModule::remove_from_white_list(1201 origin1,1202 collection_id,1203 account(2)1204 ));1205 assert!(!TemplateModule::white_list(collection_id, 2));1206 });1207}12081209// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1210#[test]1211fn white_list_test_1() {1212 new_test_ext().execute_with(|| {1213 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12141215 let origin1 = Origin::signed(1);12161217 let data = default_nft_data();1218 create_test_item(collection_id, &data.into());12191220 assert_ok!(TemplateModule::set_public_access_mode(1221 origin1.clone(),1222 collection_id,1223 AccessMode::WhiteList1224 ));1225 assert_ok!(TemplateModule::add_to_white_list(1226 origin1.clone(),1227 collection_id,1228 account(2)1229 ));12301231 assert_noop!(1232 TemplateModule::transfer(origin1, account(3), 1, 1, 1),1233 Error::<Test>::AddresNotInWhiteList1234 );1235 });1236}12371238#[test]1239fn white_list_test_2() {1240 new_test_ext().execute_with(|| {1241 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1242 let origin1 = Origin::signed(1);12431244 let data = default_nft_data();1245 create_test_item(collection_id, &data.into());12461247 assert_ok!(TemplateModule::set_public_access_mode(1248 origin1.clone(),1249 collection_id,1250 AccessMode::WhiteList1251 ));1252 assert_ok!(TemplateModule::add_to_white_list(1253 origin1.clone(),1254 1,1255 account(1)1256 ));1257 assert_ok!(TemplateModule::add_to_white_list(1258 origin1.clone(),1259 1,1260 account(2)1261 ));12621263 // do approve1264 assert_ok!(TemplateModule::approve(1265 origin1.clone(),1266 account(1),1267 1,1268 1,1269 11270 ));1271 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);12721273 assert_ok!(TemplateModule::remove_from_white_list(1274 origin1.clone(),1275 1,1276 account(1)1277 ));12781279 assert_noop!(1280 TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),1281 Error::<Test>::AddresNotInWhiteList1282 );1283 });1284}12851286// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1287#[test]1288fn white_list_test_3() {1289 new_test_ext().execute_with(|| {1290 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12911292 let origin1 = Origin::signed(1);12931294 let data = default_nft_data();1295 create_test_item(collection_id, &data.into());12961297 assert_ok!(TemplateModule::set_public_access_mode(1298 origin1.clone(),1299 collection_id,1300 AccessMode::WhiteList1301 ));1302 assert_ok!(TemplateModule::add_to_white_list(1303 origin1.clone(),1304 1,1305 account(1)1306 ));13071308 assert_noop!(1309 TemplateModule::transfer(origin1, account(3), 1, 1, 1),1310 Error::<Test>::AddresNotInWhiteList1311 );1312 });1313}13141315#[test]1316fn white_list_test_4() {1317 new_test_ext().execute_with(|| {1318 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13191320 let origin1 = Origin::signed(1);13211322 let data = default_nft_data();1323 create_test_item(collection_id, &data.into());13241325 assert_ok!(TemplateModule::set_public_access_mode(1326 origin1.clone(),1327 collection_id,1328 AccessMode::WhiteList1329 ));1330 assert_ok!(TemplateModule::add_to_white_list(1331 origin1.clone(),1332 collection_id,1333 account(1)1334 ));1335 assert_ok!(TemplateModule::add_to_white_list(1336 origin1.clone(),1337 collection_id,1338 account(2)1339 ));13401341 // do approve1342 assert_ok!(TemplateModule::approve(1343 origin1.clone(),1344 account(1),1345 1,1346 1,1347 11348 ));1349 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);13501351 assert_ok!(TemplateModule::remove_from_white_list(1352 origin1.clone(),1353 collection_id,1354 account(2)1355 ));13561357 assert_noop!(1358 TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),1359 Error::<Test>::AddresNotInWhiteList1360 );1361 });1362}13631364// 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)1365#[test]1366fn white_list_test_5() {1367 new_test_ext().execute_with(|| {1368 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13691370 let origin1 = Origin::signed(1);13711372 let data = default_nft_data();1373 create_test_item(collection_id, &data.into());13741375 assert_ok!(TemplateModule::set_public_access_mode(1376 origin1.clone(),1377 collection_id,1378 AccessMode::WhiteList1379 ));1380 assert_noop!(1381 TemplateModule::burn_item(origin1, 1, 1, 5),1382 Error::<Test>::AddresNotInWhiteList1383 );1384 });1385}13861387// If Public Access mode is set to WhiteList, token transfers can’t be Approved by a non-whitelisted address (see Approve method).1388#[test]1389fn white_list_test_6() {1390 new_test_ext().execute_with(|| {1391 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13921393 let origin1 = Origin::signed(1);13941395 let data = default_nft_data();1396 create_test_item(collection_id, &data.into());13971398 assert_ok!(TemplateModule::set_public_access_mode(1399 origin1.clone(),1400 collection_id,1401 AccessMode::WhiteList1402 ));14031404 // do approve1405 assert_noop!(1406 TemplateModule::approve(origin1, account(1), 1, 1, 5),1407 Error::<Test>::AddresNotInWhiteList1408 );1409 });1410}14111412// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1413// tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1414#[test]1415fn white_list_test_7() {1416 new_test_ext().execute_with(|| {1417 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14181419 let data = default_nft_data();1420 create_test_item(collection_id, &data.into());14211422 let origin1 = Origin::signed(1);14231424 assert_ok!(TemplateModule::set_public_access_mode(1425 origin1.clone(),1426 collection_id,1427 AccessMode::WhiteList1428 ));1429 assert_ok!(TemplateModule::add_to_white_list(1430 origin1.clone(),1431 collection_id,1432 account(1)1433 ));1434 assert_ok!(TemplateModule::add_to_white_list(1435 origin1.clone(),1436 collection_id,1437 account(2)1438 ));14391440 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1));1441 });1442}14431444#[test]1445fn white_list_test_8() {1446 new_test_ext().execute_with(|| {1447 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14481449 let data = default_nft_data();1450 create_test_item(collection_id, &data.into());14511452 let origin1 = Origin::signed(1);14531454 assert_ok!(TemplateModule::set_public_access_mode(1455 origin1.clone(),1456 collection_id,1457 AccessMode::WhiteList1458 ));1459 assert_ok!(TemplateModule::add_to_white_list(1460 origin1.clone(),1461 collection_id,1462 account(1)1463 ));1464 assert_ok!(TemplateModule::add_to_white_list(1465 origin1.clone(),1466 collection_id,1467 account(2)1468 ));14691470 // do approve1471 assert_ok!(TemplateModule::approve(1472 origin1.clone(),1473 account(1),1474 1,1475 1,1476 51477 ));1478 assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 5);14791480 assert_ok!(TemplateModule::transfer_from(1481 origin1,1482 account(1),1483 account(2),1484 1,1485 1,1486 11487 ));1488 });1489}14901491// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1492#[test]1493fn white_list_test_9() {1494 new_test_ext().execute_with(|| {1495 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1496 let origin1 = Origin::signed(1);14971498 assert_ok!(TemplateModule::set_public_access_mode(1499 origin1.clone(),1500 collection_id,1501 AccessMode::WhiteList1502 ));1503 assert_ok!(TemplateModule::set_mint_permission(1504 origin1,1505 collection_id,1506 false1507 ));15081509 let data = default_nft_data();1510 create_test_item(collection_id, &data.into());1511 });1512}15131514// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1515#[test]1516fn white_list_test_10() {1517 new_test_ext().execute_with(|| {1518 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15191520 let origin1 = Origin::signed(1);1521 let origin2 = Origin::signed(2);15221523 assert_ok!(TemplateModule::set_public_access_mode(1524 origin1.clone(),1525 collection_id,1526 AccessMode::WhiteList1527 ));1528 assert_ok!(TemplateModule::set_mint_permission(1529 origin1.clone(),1530 collection_id,1531 false1532 ));15331534 assert_ok!(TemplateModule::add_collection_admin(1535 origin1,1536 collection_id,1537 account(2)1538 ));15391540 assert_ok!(TemplateModule::create_item(1541 origin2,1542 collection_id,1543 account(2),1544 default_nft_data().into()1545 ));1546 });1547}15481549// 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.1550#[test]1551fn white_list_test_11() {1552 new_test_ext().execute_with(|| {1553 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15541555 let origin1 = Origin::signed(1);1556 let origin2 = Origin::signed(2);15571558 assert_ok!(TemplateModule::set_public_access_mode(1559 origin1.clone(),1560 collection_id,1561 AccessMode::WhiteList1562 ));1563 assert_ok!(TemplateModule::set_mint_permission(1564 origin1.clone(),1565 collection_id,1566 false1567 ));1568 assert_ok!(TemplateModule::add_to_white_list(1569 origin1,1570 collection_id,1571 account(2)1572 ));15731574 assert_noop!(1575 TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1576 Error::<Test>::PublicMintingNotAllowed1577 );1578 });1579}15801581// 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.1582#[test]1583fn white_list_test_12() {1584 new_test_ext().execute_with(|| {1585 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15861587 let origin1 = Origin::signed(1);1588 let origin2 = Origin::signed(2);15891590 assert_ok!(TemplateModule::set_public_access_mode(1591 origin1.clone(),1592 collection_id,1593 AccessMode::WhiteList1594 ));1595 assert_ok!(TemplateModule::set_mint_permission(1596 origin1,1597 collection_id,1598 false1599 ));16001601 assert_noop!(1602 TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1603 Error::<Test>::PublicMintingNotAllowed1604 );1605 });1606}16071608// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1609#[test]1610fn white_list_test_13() {1611 new_test_ext().execute_with(|| {1612 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16131614 let origin1 = Origin::signed(1);16151616 assert_ok!(TemplateModule::set_public_access_mode(1617 origin1.clone(),1618 collection_id,1619 AccessMode::WhiteList1620 ));1621 assert_ok!(TemplateModule::set_mint_permission(1622 origin1,1623 collection_id,1624 true1625 ));16261627 let data = default_nft_data();1628 create_test_item(collection_id, &data.into());1629 });1630}16311632// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1633#[test]1634fn white_list_test_14() {1635 new_test_ext().execute_with(|| {1636 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16371638 let origin1 = Origin::signed(1);1639 let origin2 = Origin::signed(2);16401641 assert_ok!(TemplateModule::set_public_access_mode(1642 origin1.clone(),1643 collection_id,1644 AccessMode::WhiteList1645 ));1646 assert_ok!(TemplateModule::set_mint_permission(1647 origin1.clone(),1648 collection_id,1649 true1650 ));16511652 assert_ok!(TemplateModule::add_collection_admin(1653 origin1,1654 collection_id,1655 account(2)1656 ));16571658 assert_ok!(TemplateModule::create_item(1659 origin2,1660 1,1661 account(2),1662 default_nft_data().into()1663 ));1664 });1665}16661667// 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.1668#[test]1669fn white_list_test_15() {1670 new_test_ext().execute_with(|| {1671 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16721673 let origin1 = Origin::signed(1);1674 let origin2 = Origin::signed(2);16751676 assert_ok!(TemplateModule::set_public_access_mode(1677 origin1.clone(),1678 collection_id,1679 AccessMode::WhiteList1680 ));1681 assert_ok!(TemplateModule::set_mint_permission(1682 origin1,1683 collection_id,1684 true1685 ));16861687 assert_noop!(1688 TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1689 Error::<Test>::AddresNotInWhiteList1690 );1691 });1692}16931694// 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.1695#[test]1696fn white_list_test_16() {1697 new_test_ext().execute_with(|| {1698 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16991700 let origin1 = Origin::signed(1);1701 let origin2 = Origin::signed(2);17021703 assert_ok!(TemplateModule::set_public_access_mode(1704 origin1.clone(),1705 collection_id,1706 AccessMode::WhiteList1707 ));1708 assert_ok!(TemplateModule::set_mint_permission(1709 origin1.clone(),1710 collection_id,1711 true1712 ));1713 assert_ok!(TemplateModule::add_to_white_list(1714 origin1,1715 collection_id,1716 account(2)1717 ));17181719 assert_ok!(TemplateModule::create_item(1720 origin2,1721 1,1722 account(2),1723 default_nft_data().into()1724 ));1725 });1726}17271728// Total number of collections. Positive test1729#[test]1730fn total_number_collections_bound() {1731 new_test_ext().execute_with(|| {1732 create_test_collection(&CollectionMode::NFT, 1);1733 });1734}17351736// Total number of collections. Negotive test1737#[test]1738fn total_number_collections_bound_neg() {1739 new_test_ext().execute_with(|| {1740 let origin1 = Origin::signed(1);17411742 for i in 0..COLLECTION_NUMBER_LIMIT {1743 create_test_collection(&CollectionMode::NFT, i + 1);1744 }17451746 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1747 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1748 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();17491750 // 11-th collection in chain. Expects error1751 assert_noop!(1752 TemplateModule::create_collection(1753 origin1,1754 col_name1,1755 col_desc1,1756 token_prefix1,1757 CollectionMode::NFT1758 ),1759 Error::<Test>::TotalCollectionsLimitExceeded1760 );1761 });1762}17631764// Owned tokens by a single address. Positive test1765#[test]1766fn owned_tokens_bound() {1767 new_test_ext().execute_with(|| {1768 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17691770 let data = default_nft_data();1771 create_test_item(collection_id, &data.clone().into());1772 create_test_item(collection_id, &data.into());1773 });1774}17751776// Owned tokens by a single address. Negotive test1777#[test]1778fn owned_tokens_bound_neg() {1779 new_test_ext().execute_with(|| {1780 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17811782 let origin1 = Origin::signed(1);17831784 for _ in 0..ACCOUNT_TOKEN_OWNERSHIP_LIMIT {1785 let data = default_nft_data();1786 create_test_item(collection_id, &data.clone().into());1787 }17881789 let data = default_nft_data();1790 assert_noop!(1791 TemplateModule::create_item(origin1, 1, account(1), data.into()),1792 Error::<Test>::AddressOwnershipLimitExceeded1793 );1794 });1795}17961797// Number of collection admins. Positive test1798#[test]1799fn collection_admins_bound() {1800 new_test_ext().execute_with(|| {1801 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18021803 let origin1 = Origin::signed(1);18041805 assert_ok!(TemplateModule::add_collection_admin(1806 origin1.clone(),1807 collection_id,1808 account(2)1809 ));1810 assert_ok!(TemplateModule::add_collection_admin(1811 origin1,1812 collection_id,1813 account(3)1814 ));1815 });1816}18171818// Number of collection admins. Negotive test1819#[test]1820fn collection_admins_bound_neg() {1821 new_test_ext().execute_with(|| {1822 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18231824 let origin1 = Origin::signed(1);18251826 for i in 0..COLLECTION_ADMINS_LIMIT {1827 assert_ok!(TemplateModule::add_collection_admin(1828 origin1.clone(),1829 collection_id,1830 account(2 + i)1831 ));1832 }1833 assert_noop!(1834 TemplateModule::add_collection_admin(1835 origin1,1836 collection_id,1837 account(3 + COLLECTION_ADMINS_LIMIT)1838 ),1839 Error::<Test>::CollectionAdminsLimitExceeded1840 );1841 });1842}1843// #endregion18441845#[test]1846fn set_const_on_chain_schema() {1847 new_test_ext().execute_with(|| {1848 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18491850 let origin1 = Origin::signed(1);1851 assert_ok!(TemplateModule::set_const_on_chain_schema(1852 origin1,1853 collection_id,1854 b"test const on chain schema".to_vec()1855 ));18561857 assert_eq!(1858 TemplateModule::collection_id(collection_id)1859 .unwrap()1860 .const_on_chain_schema,1861 b"test const on chain schema".to_vec()1862 );1863 assert_eq!(1864 TemplateModule::collection_id(collection_id)1865 .unwrap()1866 .variable_on_chain_schema,1867 b"".to_vec()1868 );1869 });1870}18711872#[test]1873fn set_variable_on_chain_schema() {1874 new_test_ext().execute_with(|| {1875 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18761877 let origin1 = Origin::signed(1);1878 assert_ok!(TemplateModule::set_variable_on_chain_schema(1879 origin1,1880 collection_id,1881 b"test variable on chain schema".to_vec()1882 ));18831884 assert_eq!(1885 TemplateModule::collection_id(collection_id)1886 .unwrap()1887 .const_on_chain_schema,1888 b"".to_vec()1889 );1890 assert_eq!(1891 TemplateModule::collection_id(collection_id)1892 .unwrap()1893 .variable_on_chain_schema,1894 b"test variable on chain schema".to_vec()1895 );1896 });1897}18981899#[test]1900fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1901 new_test_ext().execute_with(|| {1902 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19031904 let origin1 = Origin::signed(1);19051906 let data = default_nft_data();1907 create_test_item(1, &data.into());19081909 let variable_data = b"test data".to_vec();1910 assert_ok!(TemplateModule::set_variable_meta_data(1911 origin1,1912 collection_id,1913 1,1914 variable_data.clone()1915 ));19161917 assert_eq!(1918 TemplateModule::nft_item_id(collection_id, 1)1919 .unwrap()1920 .variable_data,1921 variable_data1922 );1923 });1924}19251926#[test]1927fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1928 new_test_ext().execute_with(|| {1929 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);19301931 let origin1 = Origin::signed(1);19321933 let data = default_re_fungible_data();1934 create_test_item(1, &data.into());19351936 let variable_data = b"test data".to_vec();1937 assert_ok!(TemplateModule::set_variable_meta_data(1938 origin1,1939 collection_id,1940 1,1941 variable_data.clone()1942 ));19431944 assert_eq!(1945 TemplateModule::refungible_item_id(collection_id, 1)1946 .unwrap()1947 .variable_data,1948 variable_data1949 );1950 });1951}19521953#[test]1954fn set_variable_meta_data_on_fungible_token_fails() {1955 new_test_ext().execute_with(|| {1956 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);19571958 let origin1 = Origin::signed(1);19591960 let data = default_fungible_data();1961 create_test_item(1, &data.into());19621963 let variable_data = b"test data".to_vec();1964 assert_noop!(1965 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),1966 Error::<Test>::CantStoreMetadataInFungibleTokens1967 );1968 });1969}19701971#[test]1972fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1973 new_test_ext().execute_with(|| {1974 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19751976 let origin1 = Origin::signed(1);19771978 let data = default_nft_data();1979 create_test_item(1, &data.into());19801981 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1982 assert_noop!(1983 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),1984 Error::<Test>::TokenVariableDataLimitExceeded1985 );1986 });1987}19881989#[test]1990fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1991 new_test_ext().execute_with(|| {1992 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);19931994 let origin1 = Origin::signed(1);19951996 let data = default_re_fungible_data();1997 create_test_item(1, &data.into());19981999 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2000 assert_noop!(2001 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),2002 Error::<Test>::TokenVariableDataLimitExceeded2003 );2004 });2005}20062007#[test]2008fn collection_transfer_flag_works() {2009 new_test_ext().execute_with(|| {2010 let origin1 = Origin::signed(1);20112012 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2013 assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, 1, true));20142015 let data = default_nft_data();2016 create_test_item(collection_id, &data.into());2017 assert_eq!(TemplateModule::balance_count(1, 1), 1);2018 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);20192020 let origin1 = Origin::signed(1);20212022 // default scenario2023 assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1000));2024 assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(2));2025 assert_eq!(TemplateModule::balance_count(1, 1), 0);2026 assert_eq!(TemplateModule::balance_count(1, 2), 1);20272028 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);2029 });2030}20312032#[test]2033fn collection_transfer_flag_works_neg() {2034 new_test_ext().execute_with(|| {2035 let origin1 = Origin::signed(1);20362037 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2038 assert_ok!(TemplateModule::set_transfers_enabled_flag(2039 origin1, 1, false2040 ));20412042 let data = default_nft_data();2043 create_test_item(collection_id, &data.into());2044 assert_eq!(TemplateModule::balance_count(1, 1), 1);2045 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);20462047 let origin1 = Origin::signed(1);20482049 // default scenario2050 assert_noop!(2051 TemplateModule::transfer(origin1, account(2), 1, 1, 1000),2052 Error::<Test>::TransferNotAllowed2053 );2054 assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(1));2055 assert_eq!(TemplateModule::balance_count(1, 1), 1);2056 assert_eq!(TemplateModule::balance_count(1, 2), 0);20572058 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);2059 });2060}primitives/nft/Cargo.tomldiffbeforeafterboth--- a/primitives/nft/Cargo.toml
+++ b/primitives/nft/Cargo.toml
@@ -9,20 +9,28 @@
version = '0.9.0'
[dependencies]
-codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false, features = ['derive'] }
-serde = { version = "1.0.119", features = ['derive'], default-features = false }
+codec = { package = "parity-scale-codec", version = "2.2.0", default-features = false, features = ['derive'] }
+serde = { version = "1.0.119", features = ['derive'], default-features = false, optional = true }
+max-encoded-len = { default-features = false, features = ['derive'], version = '3.0.0', git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.8' }
frame-support = { default-features = false, version = '3.0.0', git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.8' }
frame-system = { default-features = false, version = '3.0.0', git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.8' }
sp-core = { version = "3.0.0", default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.8' }
+sp-std = { version = "3.0.0", default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.8' }
sp-runtime = { version = "3.0.0", default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.8' }
+derivative = "2.2.0"
[features]
default = ["std"]
std = [
+ "serde1",
"serde/std",
"codec/std",
+ "max-encoded-len/std",
"frame-system/std",
"frame-support/std",
"sp-runtime/std",
"sp-core/std",
-]
\ No newline at end of file
+ "sp-std/std",
+]
+serde1 = ["serde"]
+limit-testing = []
\ No newline at end of file
primitives/nft/src/lib.rsdiffbeforeafterboth--- a/primitives/nft/src/lib.rs
+++ b/primitives/nft/src/lib.rs
@@ -1,11 +1,13 @@
#![cfg_attr(not(feature = "std"), no_std)]
+#[cfg(feature = "serde")]
pub use serde::{Serialize, Deserialize};
use sp_runtime::sp_std::prelude::Vec;
use codec::{Decode, Encode};
+use max_encoded_len::MaxEncodedLen;
pub use frame_support::{
- construct_runtime, decl_event, decl_module, decl_storage, decl_error,
+ BoundedVec, construct_runtime, decl_event, decl_module, decl_storage, decl_error,
dispatch::DispatchResult,
ensure, fail, parameter_types,
traits::{
@@ -19,18 +21,54 @@
},
StorageValue, transactional,
};
+use derivative::Derivative;
pub const MAX_DECIMAL_POINTS: DecimalPoints = 30;
pub const MAX_REFUNGIBLE_PIECES: u128 = 1_000_000_000_000_000_000_000;
pub const MAX_SPONSOR_TIMEOUT: u32 = 10_368_000;
pub const MAX_TOKEN_OWNERSHIP: u32 = 10_000_000;
+pub const COLLECTION_NUMBER_LIMIT: u32 = if cfg!(not(feature = "limit-testing")) {
+ 100000
+} else {
+ 10
+};
+pub const CUSTOM_DATA_LIMIT: u32 = if cfg!(not(feature = "limit-testing")) {
+ 2048
+} else {
+ 10
+};
+pub const COLLECTION_ADMINS_LIMIT: u64 = 5;
+pub const ACCOUNT_TOKEN_OWNERSHIP_LIMIT: u32 = if cfg!(not(feature = "limit-testing")) {
+ 1000000
+} else {
+ 10
+};
+
+// Timeouts for item types in passed blocks
+pub const NFT_SPONSOR_TRANSFER_TIMEOUT: u32 = 5;
+pub const FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT: u32 = 5;
+pub const REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT: u32 = 5;
+
+// Schema limits
+pub const OFFCHAIN_SCHEMA_LIMIT: u32 = 1024;
+pub const VARIABLE_ON_CHAIN_SCHEMA_LIMIT: u32 = 1024;
+pub const CONST_ON_CHAIN_SCHEMA_LIMIT: u32 = 1024;
+
+/// How much items can be created per single
+/// create_many call
+pub const MAX_ITEMS_PER_BATCH: u32 = 200;
+
+parameter_types! {
+ pub const CustomDataLimit: u32 = CUSTOM_DATA_LIMIT;
+}
+
pub type CollectionId = u32;
pub type TokenId = u32;
pub type DecimalPoints = u8;
#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
pub enum CollectionMode {
Invalid,
NFT,
@@ -61,7 +99,7 @@
}
#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
pub enum AccessMode {
Normal,
WhiteList,
@@ -73,7 +111,7 @@
}
#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
pub enum SchemaVersion {
ImageURL,
Unique,
@@ -85,14 +123,14 @@
}
#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
pub struct Ownership<AccountId> {
pub owner: AccountId,
pub fraction: u128,
}
#[derive(Encode, Decode, Debug, Clone, PartialEq)]
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
pub enum SponsorshipState<AccountId> {
/// The fees are applied to the transaction sender
Disabled,
@@ -128,7 +166,7 @@
}
#[derive(Encode, Decode, Clone, PartialEq)]
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
pub struct Collection<T: frame_system::Config> {
pub owner: T::AccountId,
pub mode: CollectionMode,
@@ -148,7 +186,7 @@
}
#[derive(Encode, Decode, Debug, Clone, PartialEq)]
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
pub struct NftItemType<AccountId> {
pub owner: AccountId,
pub const_data: Vec<u8>,
@@ -156,13 +194,13 @@
}
#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
pub struct FungibleItemType {
pub value: u128,
}
#[derive(Encode, Decode, Debug, Clone, PartialEq)]
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
pub struct ReFungibleItemType<AccountId> {
pub owner: Vec<Ownership<AccountId>>,
pub const_data: Vec<u8>,
@@ -170,7 +208,7 @@
}
#[derive(Encode, Decode, Debug, Clone, PartialEq)]
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
pub struct CollectionLimits<BlockNumber: Encode + Decode> {
pub account_token_ownership_limit: u32,
pub sponsored_data_size: u32,
@@ -200,48 +238,72 @@
}
}
-#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
-pub struct ChainLimits {
- pub collection_numbers_limit: u32,
- pub account_token_ownership_limit: u32,
- pub collections_admins_limit: u64,
- pub custom_data_limit: u32,
+/// BoundedVec doesn't supports serde
+#[cfg(feature = "serde1")]
+mod bounded_serde {
+ use core::convert::TryFrom;
+ use frame_support::{BoundedVec, traits::Get};
+ use serde::{
+ ser::{self, Serialize},
+ de::{self, Deserialize, Error},
+ };
+ use sp_std::vec::Vec;
- // Timeouts for item types in passed blocks
- pub nft_sponsor_transfer_timeout: u32,
- pub fungible_sponsor_transfer_timeout: u32,
- pub refungible_sponsor_transfer_timeout: u32,
+ pub fn serialize<D, V, S>(value: &BoundedVec<V, S>, serializer: D) -> Result<D::Ok, D::Error>
+ where
+ D: ser::Serializer,
+ V: Serialize,
+ {
+ let vec: &Vec<_> = &value;
+ vec.serialize(serializer)
+ }
- // Schema limits
- pub offchain_schema_limit: u32,
- pub variable_on_chain_schema_limit: u32,
- pub const_on_chain_schema_limit: u32,
+ pub fn deserialize<'de, D, V, S>(deserializer: D) -> Result<BoundedVec<V, S>, D::Error>
+ where
+ D: de::Deserializer<'de>,
+ V: de::Deserialize<'de>,
+ S: Get<u32>,
+ {
+ // TODO: Implement custom visitor, which will limit vec size at parse time? Will serde only be used by chainspec?
+ let vec = <Vec<V>>::deserialize(deserializer)?;
+ let len = vec.len();
+ TryFrom::try_from(vec).map_err(|_| D::Error::invalid_length(len, &"lesser size"))
+ }
}
-#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, MaxEncodedLen, Default, PartialEq, Clone, Derivative)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
+#[derivative(Debug)]
pub struct CreateNftData {
- pub const_data: Vec<u8>,
- pub variable_data: Vec<u8>,
+ #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]
+ #[derivative(Debug = "ignore")]
+ pub const_data: BoundedVec<u8, CustomDataLimit>,
+ #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]
+ #[derivative(Debug = "ignore")]
+ pub variable_data: BoundedVec<u8, CustomDataLimit>,
}
-#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, MaxEncodedLen, Default, Debug, Clone, PartialEq)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
pub struct CreateFungibleData {
pub value: u128,
}
-#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, MaxEncodedLen, Default, PartialEq, Clone, Derivative)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
+#[derivative(Debug)]
pub struct CreateReFungibleData {
- pub const_data: Vec<u8>,
- pub variable_data: Vec<u8>,
+ #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]
+ #[derivative(Debug = "ignore")]
+ pub const_data: BoundedVec<u8, CustomDataLimit>,
+ #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]
+ #[derivative(Debug = "ignore")]
+ pub variable_data: BoundedVec<u8, CustomDataLimit>,
pub pieces: u128,
}
-#[derive(Encode, Decode, Debug, Clone, PartialEq)]
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, MaxEncodedLen, PartialEq, Clone, Debug)]
+#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
pub enum CreateItemData {
NFT(CreateNftData),
Fungible(CreateFungibleData),
runtime/Cargo.tomldiffbeforeafterboth--- a/runtime/Cargo.toml
+++ b/runtime/Cargo.toml
@@ -31,6 +31,7 @@
]
std = [
'codec/std',
+ 'max-encoded-len/std',
'cumulus-pallet-aura-ext/std',
'cumulus-pallet-parachain-system/std',
'cumulus-pallet-xcm/std',
@@ -84,6 +85,10 @@
'xcm-builder/std',
'xcm-executor/std',
]
+limit-testing = [
+ 'pallet-nft/limit-testing',
+ 'nft-data-structs/limit-testing',
+]
################################################################################
# Substrate Dependencies
@@ -378,6 +383,8 @@
# local dependencies
[dependencies]
+max-encoded-len = { default-features = false, features = ['derive'], version = '3.0.0', git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.8' }
+derivative = "2.2.0"
pallet-nft = { path = '../pallets/nft', default-features = false, version = '3.0.0' }
pallet-inflation = { path = '../pallets/inflation', default-features = false, version = '3.0.0' }
nft-data-structs = { path = '../primitives/nft', default-features = false, version = '0.9.0' }
runtime/src/chain_extension.rsdiffbeforeafterboth--- a/runtime/src/chain_extension.rs
+++ b/runtime/src/chain_extension.rs
@@ -6,6 +6,8 @@
//
use codec::{Decode, Encode};
+use max_encoded_len::MaxEncodedLen;
+use derivative::Derivative;
pub use pallet_contracts::chain_extension::RetVal;
use pallet_contracts::chain_extension::{
@@ -19,61 +21,63 @@
pub use pallet_nft::*;
use pallet_nft::CrossAccountId;
use nft_data_structs::*;
-
-use crate::Vec;
/// Create item parameters
-#[derive(Debug, PartialEq, Encode, Decode)]
-pub struct NFTExtCreateItem<E: Ext> {
- pub owner: <E::T as SysConfig>::AccountId,
+#[derive(Debug, PartialEq, Encode, Decode, MaxEncodedLen)]
+pub struct NFTExtCreateItem<AccountId> {
+ pub owner: AccountId,
pub collection_id: u32,
pub data: CreateItemData,
}
/// Transfer parameters
-#[derive(Debug, PartialEq, Encode, Decode)]
-pub struct NFTExtTransfer<E: Ext> {
- pub recipient: <E::T as SysConfig>::AccountId,
+#[derive(Debug, PartialEq, Encode, Decode, MaxEncodedLen)]
+pub struct NFTExtTransfer<AccountId> {
+ pub recipient: AccountId,
pub collection_id: u32,
pub token_id: u32,
pub amount: u128,
}
-#[derive(Debug, PartialEq, Encode, Decode)]
-pub struct NFTExtCreateMultipleItems<E: Ext> {
- pub owner: <E::T as SysConfig>::AccountId,
+#[derive(Derivative, PartialEq, Encode, Decode, MaxEncodedLen)]
+#[derivative(Debug)]
+pub struct NFTExtCreateMultipleItems<AccountId> {
+ pub owner: AccountId,
pub collection_id: u32,
- pub data: Vec<CreateItemData>,
+ #[derivative(Debug = "ignore")]
+ pub data: BoundedVec<CreateItemData, MaxItemsPerBatch>,
}
-#[derive(Debug, PartialEq, Encode, Decode)]
-pub struct NFTExtApprove<E: Ext> {
- pub spender: <E::T as SysConfig>::AccountId,
+#[derive(Debug, PartialEq, Encode, Decode, MaxEncodedLen)]
+pub struct NFTExtApprove<AccountId> {
+ pub spender: AccountId,
pub collection_id: u32,
pub item_id: u32,
pub amount: u128,
}
-#[derive(Debug, PartialEq, Encode, Decode)]
-pub struct NFTExtTransferFrom<E: Ext> {
- pub owner: <E::T as SysConfig>::AccountId,
- pub recipient: <E::T as SysConfig>::AccountId,
+#[derive(Debug, PartialEq, Encode, Decode, MaxEncodedLen)]
+pub struct NFTExtTransferFrom<AccountId> {
+ pub owner: AccountId,
+ pub recipient: AccountId,
pub collection_id: u32,
pub item_id: u32,
pub amount: u128,
}
-#[derive(Debug, PartialEq, Encode, Decode)]
+#[derive(Derivative, PartialEq, Encode, Decode, MaxEncodedLen)]
+#[derivative(Debug)]
pub struct NFTExtSetVariableMetaData {
pub collection_id: u32,
pub item_id: u32,
- pub data: Vec<u8>,
+ #[derivative(Debug = "ignore")]
+ pub data: BoundedVec<u8, MaxDataSize>,
}
-#[derive(Debug, PartialEq, Encode, Decode)]
-pub struct NFTExtToggleWhiteList<E: Ext> {
+#[derive(Debug, PartialEq, Encode, Decode, MaxEncodedLen)]
+pub struct NFTExtToggleWhiteList<AccountId> {
pub collection_id: u32,
- pub address: <E::T as SysConfig>::AccountId,
+ pub address: AccountId,
pub whitelisted: bool,
}
@@ -82,6 +86,8 @@
pub type NftWeightInfoOf<C> = <C as pallet_nft::Config>::WeightInfo;
+pub type AccountIdOf<C> = <C as SysConfig>::AccountId;
+
impl<C: Config + pallet_contracts::Config> ChainExtension<C> for NFTExtension {
fn call<E: Ext>(func_id: u32, env: Environment<E, InitState>) -> Result<RetVal, DispatchError>
where
@@ -93,7 +99,7 @@
match func_id {
0 => {
let mut env = env.buf_in_buf_out();
- let input: NFTExtTransfer<E> = env.read_as()?;
+ let input: NFTExtTransfer<AccountIdOf<C>> = env.read_as()?;
env.charge_weight(NftWeightInfoOf::<C>::transfer())?;
let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
@@ -106,13 +112,13 @@
input.amount,
)?;
- pallet_nft::Module::<C>::submit_logs(collection)?;
+ collection.submit_logs()?;
Ok(RetVal::Converging(0))
}
1 => {
// Create Item
let mut env = env.buf_in_buf_out();
- let input: NFTExtCreateItem<E> = env.read_as()?;
+ let input: NFTExtCreateItem<AccountIdOf<C>> = env.read_as()?;
env.charge_weight(NftWeightInfoOf::<C>::create_item(input.data.data_size()))?;
let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
@@ -124,13 +130,13 @@
input.data,
)?;
- pallet_nft::Module::<C>::submit_logs(collection)?;
+ collection.submit_logs()?;
Ok(RetVal::Converging(0))
}
2 => {
// Create multiple items
let mut env = env.buf_in_buf_out();
- let input: NFTExtCreateMultipleItems<E> = env.read_as()?;
+ let input: NFTExtCreateMultipleItems<AccountIdOf<C>> = env.read_as()?;
env.charge_weight(NftWeightInfoOf::<C>::create_item(
input.data.iter().map(|i| i.data_size()).sum(),
))?;
@@ -141,16 +147,16 @@
&C::CrossAccountId::from_sub(env.ext().address().clone()),
&collection,
&C::CrossAccountId::from_sub(input.owner),
- input.data,
+ input.data.into_inner(),
)?;
- pallet_nft::Module::<C>::submit_logs(collection)?;
+ collection.submit_logs()?;
Ok(RetVal::Converging(0))
}
3 => {
// Approve
let mut env = env.buf_in_buf_out();
- let input: NFTExtApprove<E> = env.read_as()?;
+ let input: NFTExtApprove<AccountIdOf<C>> = env.read_as()?;
env.charge_weight(NftWeightInfoOf::<C>::approve())?;
let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
@@ -163,13 +169,13 @@
input.amount,
)?;
- pallet_nft::Module::<C>::submit_logs(collection)?;
+ collection.submit_logs()?;
Ok(RetVal::Converging(0))
}
4 => {
// Transfer from
let mut env = env.buf_in_buf_out();
- let input: NFTExtTransferFrom<E> = env.read_as()?;
+ let input: NFTExtTransferFrom<AccountIdOf<C>> = env.read_as()?;
env.charge_weight(NftWeightInfoOf::<C>::transfer_from())?;
let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
@@ -183,7 +189,7 @@
input.amount,
)?;
- pallet_nft::Module::<C>::submit_logs(collection)?;
+ collection.submit_logs()?;
Ok(RetVal::Converging(0))
}
5 => {
@@ -198,16 +204,16 @@
&C::CrossAccountId::from_sub(env.ext().address().clone()),
&collection,
input.item_id,
- input.data,
+ input.data.into_inner(),
)?;
- pallet_nft::Module::<C>::submit_logs(collection)?;
+ collection.submit_logs()?;
Ok(RetVal::Converging(0))
}
6 => {
// Toggle whitelist
let mut env = env.buf_in_buf_out();
- let input: NFTExtToggleWhiteList<E> = env.read_as()?;
+ let input: NFTExtToggleWhiteList<AccountIdOf<C>> = env.read_as()?;
env.charge_weight(NftWeightInfoOf::<C>::add_to_white_list())?;
let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
@@ -219,7 +225,7 @@
input.whitelisted,
)?;
- pallet_nft::Module::<C>::submit_logs(collection)?;
+ collection.submit_logs()?;
Ok(RetVal::Converging(0))
}
_ => Err(DispatchError::Other("unknown chain_extension func_id")),
runtime/src/lib.rsdiffbeforeafterboth--- a/runtime/src/lib.rs
+++ b/runtime/src/lib.rs
@@ -72,7 +72,6 @@
use sp_runtime::{
traits::{Dispatchable},
};
-// use pallet_contracts::chain_extension::UncheckedFrom;
// pub use pallet_timestamp::Call as TimestampCall;
pub use sp_consensus_aura::sr25519::AuthorityId as AuraId;
@@ -419,7 +418,7 @@
type DepositPerStorageItem = DepositPerStorageItem;
type RentFraction = RentFraction;
type SurchargeReward = SurchargeReward;
- type WeightPrice = pallet_transaction_payment::Module<Self>;
+ type WeightPrice = pallet_transaction_payment::Pallet<Self>;
type WeightInfo = pallet_contracts::weights::SubstrateWeight<Self>;
type ChainExtension = NFTExtension;
type DeletionQueueDepth = DeletionQueueDepth;
runtime/src/nft_weights.rsdiffbeforeafterboth--- a/runtime/src/nft_weights.rs
+++ b/runtime/src/nft_weights.rs
@@ -123,11 +123,6 @@
.saturating_add(DbWeight::get().reads(2_u64))
.saturating_add(DbWeight::get().writes(1_u64))
}
- fn set_chain_limits() -> Weight {
- 1_300_000_u64
- .saturating_add(DbWeight::get().reads(0_u64))
- .saturating_add(DbWeight::get().writes(1_u64))
- }
fn set_contract_sponsoring_rate_limit() -> Weight {
3_500_000_u64
.saturating_add(DbWeight::get().reads(0_u64))
tests/src/addCollectionAdmin.test.tsdiffbeforeafterboth--- a/tests/src/addCollectionAdmin.test.ts
+++ b/tests/src/addCollectionAdmin.test.ts
@@ -117,8 +117,7 @@
];
const collectionId = await createCollectionExpectSuccess();
- const chainLimit = await api.query.nft.chainLimit() as unknown as { CollectionAdminsLimit: BN };
- const chainAdminLimit = chainLimit.CollectionAdminsLimit.toNumber();
+ const chainAdminLimit = api.consts.nft.collectionAdminsLimit.toNumber();
expect(chainAdminLimit).to.be.equal(5);
for (let i = 0; i < chainAdminLimit; i++) {
tests/src/collision-tests/adminLimitsOff.test.tsdiffbeforeafterboth--- a/tests/src/collision-tests/adminLimitsOff.test.ts
+++ b/tests/src/collision-tests/adminLimitsOff.test.ts
@@ -34,8 +34,7 @@
await usingApi(async (api) => {
const collectionId = await createCollectionExpectSuccess();
- const chainLimit = await api.query.nft.chainLimit() as unknown as { CollectionAdminsLimit: BN };
- const chainAdminLimit = chainLimit.CollectionAdminsLimit.toNumber();
+ const chainAdminLimit = api.consts.nft.collectionAdminsLimit.toNumber();
expect(chainAdminLimit).to.be.equal(5);
const changeAdminTx1 = api.tx.nft.addCollectionAdmin(collectionId, Eve.address);