difftreelog
NFTPAR-183: Storage Refactoring. Reduced collection id and token id from u64 to u32.
in: master
2 files changed
pallets/nft/src/lib.rsdiffbeforeafterboth--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -48,6 +48,9 @@
// Structs
// #region
+pub type CollectionId = u32;
+pub type TokenId = u32;
+
#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub enum CollectionMode {
@@ -116,7 +119,7 @@
#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub struct NftItemType<AccountId> {
- pub collection: u64,
+ pub collection: CollectionId,
pub owner: AccountId,
pub const_data: Vec<u8>,
pub variable_data: Vec<u8>,
@@ -125,7 +128,7 @@
#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub struct FungibleItemType<AccountId> {
- pub collection: u64,
+ pub collection: CollectionId,
pub owner: AccountId,
pub value: u128,
}
@@ -133,7 +136,7 @@
#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub struct ReFungibleItemType<AccountId> {
- pub collection: u64,
+ pub collection: CollectionId,
pub owner: Vec<Ownership<AccountId>>,
pub const_data: Vec<u8>,
pub variable_data: Vec<u8>,
@@ -151,8 +154,8 @@
pub struct VestingItem<AccountId, Moment> {
pub sender: AccountId,
pub recipient: AccountId,
- pub collection_id: u64,
- pub item_id: u64,
+ pub collection_id: CollectionId,
+ pub item_id: TokenId,
pub amount: u64,
pub vesting_date: Moment,
}
@@ -167,8 +170,8 @@
#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub struct ChainLimits {
- pub collection_numbers_limit: u64,
- pub account_token_ownership_limit: u64,
+ pub collection_numbers_limit: u32,
+ pub account_token_ownership_limit: u32,
pub collections_admins_limit: u64,
pub custom_data_limit: u32,
@@ -341,41 +344,41 @@
trait Store for Module<T: Trait> as Nft {
// Private members
- NextCollectionID: u64;
- CreatedCollectionCount: u64;
+ NextCollectionID: CollectionId;
+ CreatedCollectionCount: u32;
ChainVersion: u64;
- ItemListIndex: map hasher(blake2_128_concat) u64 => u64;
+ ItemListIndex: map hasher(blake2_128_concat) CollectionId => TokenId;
// Chain limits struct
pub ChainLimit get(fn chain_limit) config(): ChainLimits;
// Bound counters
- CollectionCount: u64;
- pub AccountItemCount get(fn account_item_count): map hasher(identity) T::AccountId => u64;
+ CollectionCount: u32;
+ pub AccountItemCount get(fn account_item_count): map hasher(identity) T::AccountId => u32;
// Basic collections
- pub Collection get(fn collection) config(): map hasher(identity) u64 => CollectionType<T::AccountId>;
- pub AdminList get(fn admin_list_collection): map hasher(identity) u64 => Vec<T::AccountId>;
- pub WhiteList get(fn white_list): map hasher(identity) u64 => Vec<T::AccountId>;
+ pub Collection get(fn collection) config(): map hasher(identity) CollectionId => CollectionType<T::AccountId>;
+ pub AdminList get(fn admin_list_collection): map hasher(identity) CollectionId => Vec<T::AccountId>;
+ pub WhiteList get(fn white_list): map hasher(identity) CollectionId => Vec<T::AccountId>;
/// Balance owner per collection map
- pub Balance get(fn balance_count): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) T::AccountId => u64;
+ pub Balance get(fn balance_count): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) T::AccountId => u64;
/// second parameter: item id + owner account id
- pub ApprovedList get(fn approved): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) (u64, T::AccountId) => Vec<ApprovePermissions<T::AccountId>>;
+ pub ApprovedList get(fn approved): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) (TokenId, T::AccountId) => Vec<ApprovePermissions<T::AccountId>>;
/// Item collections
- pub NftItemList get(fn nft_item_id) config(): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => NftItemType<T::AccountId>;
- pub FungibleItemList get(fn fungible_item_id) config(): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => FungibleItemType<T::AccountId>;
- pub ReFungibleItemList get(fn refungible_item_id) config(): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => ReFungibleItemType<T::AccountId>;
+ pub NftItemList get(fn nft_item_id) config(): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => NftItemType<T::AccountId>;
+ pub FungibleItemList get(fn fungible_item_id) config(): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => FungibleItemType<T::AccountId>;
+ pub ReFungibleItemList get(fn refungible_item_id) config(): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => ReFungibleItemType<T::AccountId>;
/// Index list
- pub AddressTokens get(fn address_tokens): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) T::AccountId => Vec<u64>;
+ pub AddressTokens get(fn address_tokens): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) T::AccountId => Vec<TokenId>;
/// Tokens transfer baskets
- pub NftTransferBasket get(fn nft_transfer_basket): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => T::BlockNumber;
- pub FungibleTransferBasket get(fn fungible_transfer_basket): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => Vec<BasketItem<T::AccountId, T::BlockNumber>>;
- pub ReFungibleTransferBasket get(fn refungible_transfer_basket): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => T::BlockNumber;
+ pub NftTransferBasket get(fn nft_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => T::BlockNumber;
+ pub FungibleTransferBasket get(fn fungible_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Vec<BasketItem<T::AccountId, T::BlockNumber>>;
+ pub ReFungibleTransferBasket get(fn refungible_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => T::BlockNumber;
// Contract Sponsorship and Ownership
pub ContractOwner get(fn contract_owner): map hasher(twox_64_concat) T::AccountId => T::AccountId;
@@ -419,7 +422,7 @@
/// * mode: [CollectionMode] converted into u8.
///
/// * account_id: Collection owner.
- Created(u64, u8, AccountId),
+ Created(CollectionId, u8, AccountId),
/// New item was created.
///
@@ -428,7 +431,7 @@
/// * collection_id: Id of the collection where item was created.
///
/// * item_id: Id of an item. Unique within the collection.
- ItemCreated(u64, u64),
+ ItemCreated(CollectionId, TokenId),
/// Collection item was burned.
///
@@ -437,7 +440,7 @@
/// collection_id.
///
/// item_id: Identifier of burned NFT.
- ItemDestroyed(u64, u64),
+ ItemDestroyed(CollectionId, TokenId),
}
);
@@ -558,7 +561,7 @@
///
/// * collection_id: collection to destroy.
#[weight = T::WeightInfo::destroy_collection()]
- pub fn destroy_collection(origin, collection_id: u64) -> DispatchResult {
+ pub fn destroy_collection(origin, collection_id: CollectionId) -> DispatchResult {
let sender = ensure_signed(origin)?;
Self::check_owner_permissions(collection_id, sender)?;
@@ -605,7 +608,7 @@
///
/// * address.
#[weight = T::WeightInfo::add_to_white_list()]
- pub fn add_to_white_list(origin, collection_id: u64, address: T::AccountId) -> DispatchResult{
+ pub fn add_to_white_list(origin, collection_id: CollectionId, address: T::AccountId) -> DispatchResult{
let sender = ensure_signed(origin)?;
Self::check_owner_or_admin_permissions(collection_id, sender)?;
@@ -640,7 +643,7 @@
///
/// * address.
#[weight = T::WeightInfo::remove_from_white_list()]
- pub fn remove_from_white_list(origin, collection_id: u64, address: T::AccountId) -> DispatchResult{
+ pub fn remove_from_white_list(origin, collection_id: CollectionId, address: T::AccountId) -> DispatchResult{
let sender = ensure_signed(origin)?;
Self::check_owner_or_admin_permissions(collection_id, sender)?;
@@ -669,7 +672,7 @@
///
/// * mode: [AccessMode]
#[weight = T::WeightInfo::set_public_access_mode()]
- pub fn set_public_access_mode(origin, collection_id: u64, mode: AccessMode) -> DispatchResult
+ pub fn set_public_access_mode(origin, collection_id: CollectionId, mode: AccessMode) -> DispatchResult
{
let sender = ensure_signed(origin)?;
@@ -695,7 +698,7 @@
///
/// * mint_permission: Boolean parameter. If True, allows minting to Anyone with conditions above.
#[weight = T::WeightInfo::set_mint_permission()]
- pub fn set_mint_permission(origin, collection_id: u64, mint_permission: bool) -> DispatchResult
+ pub fn set_mint_permission(origin, collection_id: CollectionId, mint_permission: bool) -> DispatchResult
{
let sender = ensure_signed(origin)?;
@@ -719,7 +722,7 @@
///
/// * new_owner.
#[weight = T::WeightInfo::change_collection_owner()]
- pub fn change_collection_owner(origin, collection_id: u64, new_owner: T::AccountId) -> DispatchResult {
+ pub fn change_collection_owner(origin, collection_id: CollectionId, new_owner: T::AccountId) -> DispatchResult {
let sender = ensure_signed(origin)?;
Self::check_owner_permissions(collection_id, sender)?;
@@ -744,7 +747,7 @@
///
/// * new_admin_id: Address of new admin to add.
#[weight = T::WeightInfo::add_collection_admin()]
- pub fn add_collection_admin(origin, collection_id: u64, new_admin_id: T::AccountId) -> DispatchResult {
+ pub fn add_collection_admin(origin, collection_id: CollectionId, new_admin_id: T::AccountId) -> DispatchResult {
let sender = ensure_signed(origin)?;
Self::check_owner_or_admin_permissions(collection_id, sender)?;
@@ -778,7 +781,7 @@
///
/// * account_id: Address of admin to remove.
#[weight = T::WeightInfo::remove_collection_admin()]
- pub fn remove_collection_admin(origin, collection_id: u64, account_id: T::AccountId) -> DispatchResult {
+ pub fn remove_collection_admin(origin, collection_id: CollectionId, account_id: T::AccountId) -> DispatchResult {
let sender = ensure_signed(origin)?;
Self::check_owner_or_admin_permissions(collection_id, sender)?;
@@ -803,7 +806,7 @@
///
/// * new_sponsor.
#[weight = T::WeightInfo::set_collection_sponsor()]
- pub fn set_collection_sponsor(origin, collection_id: u64, new_sponsor: T::AccountId) -> DispatchResult {
+ pub fn set_collection_sponsor(origin, collection_id: CollectionId, new_sponsor: T::AccountId) -> DispatchResult {
let sender = ensure_signed(origin)?;
ensure!(<Collection<T>>::contains_key(collection_id), Error::<T>::CollectionNotFound);
@@ -825,7 +828,7 @@
///
/// * collection_id.
#[weight = T::WeightInfo::confirm_sponsorship()]
- pub fn confirm_sponsorship(origin, collection_id: u64) -> DispatchResult {
+ pub fn confirm_sponsorship(origin, collection_id: CollectionId) -> DispatchResult {
let sender = ensure_signed(origin)?;
ensure!(<Collection<T>>::contains_key(collection_id), Error::<T>::CollectionNotFound);
@@ -850,7 +853,7 @@
///
/// * collection_id.
#[weight = T::WeightInfo::remove_collection_sponsor()]
- pub fn remove_collection_sponsor(origin, collection_id: u64) -> DispatchResult {
+ pub fn remove_collection_sponsor(origin, collection_id: CollectionId) -> DispatchResult {
let sender = ensure_signed(origin)?;
ensure!(<Collection<T>>::contains_key(collection_id), Error::<T>::CollectionNotFound);
@@ -889,7 +892,7 @@
// .saturating_add(RocksDbWeight::get().writes(8 as Weight))]
#[weight = T::WeightInfo::create_item(data.len())]
- pub fn create_item(origin, collection_id: u64, owner: T::AccountId, data: CreateItemData) -> DispatchResult {
+ pub fn create_item(origin, collection_id: CollectionId, owner: T::AccountId, data: CreateItemData) -> DispatchResult {
let sender = ensure_signed(origin)?;
@@ -925,7 +928,7 @@
#[weight = T::WeightInfo::create_item(items_data.into_iter()
.map(|data| { data.len() })
.sum())]
- pub fn create_multiple_items(origin, collection_id: u64, owner: T::AccountId, items_data: Vec<CreateItemData>) -> DispatchResult {
+ pub fn create_multiple_items(origin, collection_id: CollectionId, owner: T::AccountId, items_data: Vec<CreateItemData>) -> DispatchResult {
ensure!(items_data.len() > 0, Error::<T>::EmptyArgument);
let sender = ensure_signed(origin)?;
@@ -959,7 +962,7 @@
///
/// * item_id: ID of NFT to burn.
#[weight = T::WeightInfo::burn_item()]
- pub fn burn_item(origin, collection_id: u64, item_id: u64) -> DispatchResult {
+ pub fn burn_item(origin, collection_id: CollectionId, item_id: TokenId) -> DispatchResult {
let sender = ensure_signed(origin)?;
Self::collection_exists(collection_id)?;
@@ -1012,7 +1015,7 @@
/// * Fungible Mode: Must specify transferred amount
/// * Re-Fungible Mode: Must specify transferred portion (between 0 and 1)
#[weight = T::WeightInfo::transfer()]
- pub fn transfer(origin, recipient: T::AccountId, collection_id: u64, item_id: u64, value: u64) -> DispatchResult {
+ pub fn transfer(origin, recipient: T::AccountId, collection_id: CollectionId, item_id: TokenId, value: u64) -> DispatchResult {
let sender = ensure_signed(origin)?;
@@ -1054,7 +1057,7 @@
///
/// * item_id: ID of the item.
#[weight = T::WeightInfo::approve()]
- pub fn approve(origin, approved: T::AccountId, collection_id: u64, item_id: u64) -> DispatchResult {
+ pub fn approve(origin, approved: T::AccountId, collection_id: CollectionId, item_id: TokenId) -> DispatchResult {
let sender = ensure_signed(origin)?;
@@ -1112,7 +1115,7 @@
///
/// * value: Amount to transfer.
#[weight = T::WeightInfo::transfer_from()]
- pub fn transfer_from(origin, from: T::AccountId, recipient: T::AccountId, collection_id: u64, item_id: u64, value: u64 ) -> DispatchResult {
+ pub fn transfer_from(origin, from: T::AccountId, recipient: T::AccountId, collection_id: CollectionId, item_id: TokenId, value: u64 ) -> DispatchResult {
let sender = ensure_signed(origin)?;
let mut appoved_transfer = false;
@@ -1157,7 +1160,7 @@
///
#[weight = 0]
- pub fn safe_transfer_from(origin, collection_id: u64, item_id: u64, new_owner: T::AccountId) -> DispatchResult {
+ pub fn safe_transfer_from(origin, collection_id: CollectionId, item_id: TokenId, new_owner: T::AccountId) -> DispatchResult {
// let no_perm_mes = "You do not have permissions to modify this collection";
// ensure!(<ApprovedList<T>>::contains_key((collection_id, item_id)), no_perm_mes);
@@ -1186,8 +1189,8 @@
#[weight = T::WeightInfo::set_variable_meta_data()]
pub fn set_variable_meta_data (
origin,
- collection_id: u64,
- item_id: u64,
+ collection_id: CollectionId,
+ item_id: TokenId,
data: Vec<u8>
) -> DispatchResult {
let sender = ensure_signed(origin)?;
@@ -1231,7 +1234,7 @@
#[weight = T::WeightInfo::set_offchain_schema()]
pub fn set_offchain_schema(
origin,
- collection_id: u64,
+ collection_id: CollectionId,
schema: Vec<u8>
) -> DispatchResult {
let sender = ensure_signed(origin)?;
@@ -1259,7 +1262,7 @@
#[weight = T::WeightInfo::set_const_on_chain_schema()]
pub fn set_const_on_chain_schema (
origin,
- collection_id: u64,
+ collection_id: CollectionId,
schema: Vec<u8>
) -> DispatchResult {
let sender = ensure_signed(origin)?;
@@ -1287,7 +1290,7 @@
#[weight = T::WeightInfo::set_const_on_chain_schema()]
pub fn set_variable_on_chain_schema (
origin,
- collection_id: u64,
+ collection_id: CollectionId,
schema: Vec<u8>
) -> DispatchResult {
let sender = ensure_signed(origin)?;
@@ -1396,7 +1399,7 @@
impl<T: Trait> Module<T> {
- fn can_create_items_in_collection(collection_id: u64, collection: &CollectionType<T::AccountId>, sender: &T::AccountId, owner: &T::AccountId) -> DispatchResult {
+ fn can_create_items_in_collection(collection_id: CollectionId, collection: &CollectionType<T::AccountId>, sender: &T::AccountId, owner: &T::AccountId) -> DispatchResult {
if !Self::is_owner_or_admin_permissions(collection_id, sender.clone()) {
ensure!(collection.mint_mode == true, Error::<T>::PublicMintingNotAllowed);
@@ -1441,7 +1444,7 @@
Ok(())
}
- fn create_item_no_validation(collection_id: u64, collection: &CollectionType<T::AccountId>, owner: T::AccountId, data: CreateItemData) -> DispatchResult {
+ fn create_item_no_validation(collection_id: CollectionId, collection: &CollectionType<T::AccountId>, owner: T::AccountId, data: CreateItemData) -> DispatchResult {
match data
{
CreateItemData::NFT(data) => {
@@ -1565,8 +1568,8 @@
}
fn burn_refungible_item(
- collection_id: u64,
- item_id: u64,
+ collection_id: CollectionId,
+ item_id: TokenId,
owner: T::AccountId,
) -> DispatchResult {
ensure!(
@@ -1596,7 +1599,7 @@
Ok(())
}
- fn burn_nft_item(collection_id: u64, item_id: u64) -> DispatchResult {
+ fn burn_nft_item(collection_id: CollectionId, item_id: TokenId) -> DispatchResult {
ensure!(
<NftItemList<T>>::contains_key(collection_id, item_id),
Error::<T>::TokenNotFound
@@ -1617,7 +1620,7 @@
Ok(())
}
- fn burn_fungible_item(collection_id: u64, item_id: u64) -> DispatchResult {
+ fn burn_fungible_item(collection_id: CollectionId, item_id: TokenId) -> DispatchResult {
ensure!(
<FungibleItemList<T>>::contains_key(collection_id, item_id),
Error::<T>::TokenNotFound
@@ -1639,7 +1642,7 @@
Ok(())
}
- fn collection_exists(collection_id: u64) -> DispatchResult {
+ fn collection_exists(collection_id: CollectionId) -> DispatchResult {
ensure!(
<Collection<T>>::contains_key(collection_id),
Error::<T>::CollectionNotFound
@@ -1647,7 +1650,7 @@
Ok(())
}
- fn check_owner_permissions(collection_id: u64, subject: T::AccountId) -> DispatchResult {
+ fn check_owner_permissions(collection_id: CollectionId, subject: T::AccountId) -> DispatchResult {
Self::collection_exists(collection_id)?;
let target_collection = <Collection<T>>::get(collection_id);
@@ -1659,7 +1662,7 @@
Ok(())
}
- fn is_owner_or_admin_permissions(collection_id: u64, subject: T::AccountId) -> bool {
+ fn is_owner_or_admin_permissions(collection_id: CollectionId, subject: T::AccountId) -> bool {
let target_collection = <Collection<T>>::get(collection_id);
let mut result: bool = subject == target_collection.owner;
let exists = <AdminList<T>>::contains_key(collection_id);
@@ -1674,7 +1677,7 @@
}
fn check_owner_or_admin_permissions(
- collection_id: u64,
+ collection_id: CollectionId,
subject: T::AccountId,
) -> DispatchResult {
Self::collection_exists(collection_id)?;
@@ -1687,7 +1690,7 @@
Ok(())
}
- fn is_item_owner(subject: T::AccountId, collection_id: u64, item_id: u64) -> bool {
+ fn is_item_owner(subject: T::AccountId, collection_id: CollectionId, item_id: TokenId) -> bool {
let target_collection = <Collection<T>>::get(collection_id);
match target_collection.mode {
@@ -1707,7 +1710,7 @@
}
}
- fn check_white_list(collection_id: u64, address: &T::AccountId) -> DispatchResult {
+ fn check_white_list(collection_id: CollectionId, address: &T::AccountId) -> DispatchResult {
let mes = Error::<T>::AddresNotInWhiteList;
ensure!(<WhiteList<T>>::contains_key(collection_id), mes);
let wl = <WhiteList<T>>::get(collection_id);
@@ -1717,8 +1720,8 @@
}
fn transfer_fungible(
- collection_id: u64,
- item_id: u64,
+ collection_id: CollectionId,
+ item_id: TokenId,
value: u64,
owner: T::AccountId,
new_owner: T::AccountId,
@@ -1806,8 +1809,8 @@
}
fn transfer_refungible(
- collection_id: u64,
- item_id: u64,
+ collection_id: CollectionId,
+ item_id: TokenId,
value: u64,
owner: T::AccountId,
new_owner: T::AccountId,
@@ -1892,8 +1895,8 @@
}
fn transfer_nft(
- collection_id: u64,
- item_id: u64,
+ collection_id: CollectionId,
+ item_id: TokenId,
sender: T::AccountId,
new_owner: T::AccountId,
) -> DispatchResult {
@@ -1934,8 +1937,8 @@
}
fn item_exists(
- collection_id: u64,
- item_id: u64,
+ collection_id: CollectionId,
+ item_id: TokenId,
mode: &CollectionMode
) -> DispatchResult {
match mode {
@@ -1949,8 +1952,8 @@
}
fn set_re_fungible_variable_data(
- collection_id: u64,
- item_id: u64,
+ collection_id: CollectionId,
+ item_id: TokenId,
data: Vec<u8>
) -> DispatchResult {
let mut item = <ReFungibleItemList<T>>::get(collection_id, item_id);
@@ -1963,8 +1966,8 @@
}
fn set_nft_variable_data(
- collection_id: u64,
- item_id: u64,
+ collection_id: CollectionId,
+ item_id: TokenId,
data: Vec<u8>
) -> DispatchResult {
let mut item = <NftItemList<T>>::get(collection_id, item_id);
@@ -2058,7 +2061,7 @@
<Balance<T>>::insert(item.collection, owner.clone(), new_balance);
}
- fn add_token_index(collection_id: u64, item_index: u64, owner: T::AccountId) -> DispatchResult {
+ fn add_token_index(collection_id: CollectionId, item_index: TokenId, owner: T::AccountId) -> DispatchResult {
// add to account limit
if <AccountItemCount<T>>::contains_key(owner.clone()) {
@@ -2096,8 +2099,8 @@
}
fn remove_token_index(
- collection_id: u64,
- item_index: u64,
+ collection_id: CollectionId,
+ item_index: TokenId,
owner: T::AccountId,
) -> DispatchResult {
@@ -2123,8 +2126,8 @@
}
fn move_token_index(
- collection_id: u64,
- item_index: u64,
+ collection_id: CollectionId,
+ item_index: TokenId,
old_owner: T::AccountId,
new_owner: T::AccountId,
) -> DispatchResult {
pallets/nft/src/tests.rsdiffbeforeafterboth1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, ApprovePermissions, CollectionMode,5 Ownership, ChainLimits, CreateItemData, CreateNftData, CreateFungibleData, CreateReFungibleData}; //Err6use frame_support::{assert_noop, assert_ok};7use frame_system::{ RawOrigin };89fn default_collection_numbers_limit() -> u64 {10 1011}1213fn default_limits() {14 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 15 collection_numbers_limit: default_collection_numbers_limit(),16 account_token_ownership_limit: 10,17 collections_admins_limit: 5,18 custom_data_limit: 2048,19 nft_sponsor_transfer_timeout: 15,20 fungible_sponsor_transfer_timeout: 15,21 refungible_sponsor_transfer_timeout: 15, 22 }));23}2425fn default_nft_data() -> CreateNftData {26 CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }27}2829fn default_fungible_data () -> CreateFungibleData {30 CreateFungibleData { }31}3233fn default_re_fungible_data () -> CreateReFungibleData {34 CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }35}3637fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64, id: u64) -> u64 {38 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();39 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();40 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4142 let origin1 = Origin::signed(owner);43 assert_ok!(TemplateModule::create_collection(44 origin1.clone(),45 col_name1.clone(),46 col_desc1.clone(),47 token_prefix1.clone(),48 mode.clone()49 ));5051 let saved_col_name: Vec<u16> = "Test1\0\0".encode_utf16().collect::<Vec<u16>>();52 let saved_description: Vec<u16> = "TestDescription1\0\0".encode_utf16().collect::<Vec<u16>>();53 let saved_prefix: Vec<u8> = b"token_prefix1\0\0".to_vec();54 assert_eq!(TemplateModule::collection(id).owner, owner);55 assert_eq!(TemplateModule::collection(id).name, saved_col_name);56 assert_eq!(TemplateModule::collection(id).mode, *mode);57 assert_eq!(TemplateModule::collection(id).description, saved_description);58 assert_eq!(TemplateModule::collection(id).token_prefix, saved_prefix);59 id60}6162fn create_test_collection(mode: &CollectionMode, id: u64) -> u64 {63 create_test_collection_for_owner(&mode, 1, id)64}6566fn create_test_item(collection_id: u64, data: &CreateItemData) {67 let origin1 = Origin::signed(1);68 assert_ok!(TemplateModule::create_item(69 origin1.clone(),70 collection_id,71 1,72 data.clone()73 ));7475}7677// Use cases tests region78// #region79#[test]80fn create_nft_item() {81 new_test_ext().execute_with(|| {82 default_limits();83 let collection_id = create_test_collection(&CollectionMode::NFT, 1);84 85 let data = default_nft_data();86 create_test_item(collection_id, &data.clone().into());87 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).const_data, data.const_data);88 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, data.variable_data);89 });90}9192// Use cases tests region93// #region94#[test]95fn create_nft_multiple_items() {96 new_test_ext().execute_with(|| {97 default_limits();98 99 create_test_collection(&CollectionMode::NFT, 1);100101 let origin1 = Origin::signed(1);102103 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];104105 assert_ok!(TemplateModule::create_multiple_items(106 origin1.clone(),107 1,108 1,109 items_data.clone().into_iter().map(|d| { d.into() }).collect()110 ));111 for (index, data) in items_data.iter().enumerate() {112 assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as u64).const_data.to_vec(), data.const_data);113 assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as u64).variable_data.to_vec(), data.variable_data);114 }115 });116}117118#[test]119fn create_refungible_item() {120 new_test_ext().execute_with(|| {121 default_limits();122 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);123124 let data = default_re_fungible_data();125 create_test_item(collection_id, &data.clone().into());126 assert_eq!(127 TemplateModule::refungible_item_id(collection_id, 1).const_data,128 data.const_data129 );130 assert_eq!(131 TemplateModule::refungible_item_id(collection_id, 1).variable_data,132 data.variable_data133 );134 assert_eq!(135 TemplateModule::refungible_item_id(collection_id, 1).owner[0],136 Ownership {137 owner: 1,138 fraction: 1000139 }140 );141 });142}143144#[test]145fn create_multiple_refungible_items() {146 new_test_ext().execute_with(|| {147 default_limits();148 149 create_test_collection(&CollectionMode::ReFungible(3), 1);150151 let origin1 = Origin::signed(1);152153 let items_data = vec![default_re_fungible_data(), default_re_fungible_data(), default_re_fungible_data()];154155 assert_ok!(TemplateModule::create_multiple_items(156 origin1.clone(),157 1,158 1,159 items_data.clone().into_iter().map(|d| { d.into() }).collect()160 ));161 for (index, data) in items_data.iter().enumerate() {162163 let item = TemplateModule::refungible_item_id(1, (index + 1) as u64);164 assert_eq!(item.const_data.to_vec(), data.const_data);165 assert_eq!(item.variable_data.to_vec(), data.variable_data);166 assert_eq!(167 item.owner[0],168 Ownership {169 owner: 1,170 fraction: 1000171 }172 );173 }174 });175}176177#[test]178fn create_fungible_item() {179 new_test_ext().execute_with(|| {180 default_limits();181 182 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);183184 let data = default_fungible_data();185 create_test_item(collection_id, &data.into());186187 assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).owner, 1);188 });189}190191#[test]192fn create_multiple_fungible_items() {193 new_test_ext().execute_with(|| {194 default_limits();195196 create_test_collection(&CollectionMode::Fungible(3), 1);197198 let origin1 = Origin::signed(1);199200 let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];201202 assert_ok!(TemplateModule::create_multiple_items(203 origin1.clone(),204 1,205 1,206 items_data.clone().into_iter().map(|d| { d.into() }).collect()207 ));208 209 for (index, _) in items_data.iter().enumerate() {210 assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as u64).owner, 1);211 }212 assert_eq!(TemplateModule::balance_count(1, 1), 3000);213 assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);214 });215}216217#[test]218fn transfer_fungible_item() {219 new_test_ext().execute_with(|| {220 default_limits();221 222 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);223224 let origin1 = Origin::signed(1);225 let origin2 = Origin::signed(2);226227 let data = default_fungible_data();228 create_test_item(collection_id, &data.into());229230 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);231 assert_eq!(TemplateModule::balance_count(1, 1), 1000);232 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);233234 // change owner scenario235 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));236 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);237 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 1000);238 assert_eq!(TemplateModule::balance_count(1, 1), 0);239 assert_eq!(TemplateModule::balance_count(1, 2), 1000);240 // assert_eq!(TemplateModule::address_tokens(1, 1), []);241 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);242243 // split item scenario244 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));245 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);246 assert_eq!(TemplateModule::fungible_item_id(1, 2).owner, 3);247 assert_eq!(TemplateModule::balance_count(1, 2), 500);248 assert_eq!(TemplateModule::balance_count(1, 3), 500);249 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);250 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);251252 // split item and new owner has account scenario253 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));254 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 300);255 assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 700);256 assert_eq!(TemplateModule::balance_count(1, 2), 300);257 assert_eq!(TemplateModule::balance_count(1, 3), 700);258 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);259 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);260 });261}262263#[test]264fn transfer_refungible_item() {265 new_test_ext().execute_with(|| {266 default_limits();267 268 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);269270 let data = default_re_fungible_data();271 create_test_item(collection_id, &data.clone().into());272273 let origin1 = Origin::signed(1);274 let origin2 = Origin::signed(2);275 assert_eq!(276 TemplateModule::refungible_item_id(collection_id, 1).const_data,277 data.const_data278 );279 assert_eq!(280 TemplateModule::refungible_item_id(collection_id, 1).variable_data,281 data.variable_data282 );283 assert_eq!(284 TemplateModule::refungible_item_id(collection_id, 1).owner[0],285 Ownership {286 owner: 1,287 fraction: 1000288 }289 );290 assert_eq!(TemplateModule::balance_count(1, 1), 1000);291 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);292293 // change owner scenario294 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));295 assert_eq!(296 TemplateModule::refungible_item_id(1, 1).owner[0],297 Ownership {298 owner: 2,299 fraction: 1000300 }301 );302 assert_eq!(TemplateModule::balance_count(1, 1), 0);303 assert_eq!(TemplateModule::balance_count(1, 2), 1000);304 // assert_eq!(TemplateModule::address_tokens(1, 1), []);305 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);306307 // split item scenario308 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));309 assert_eq!(310 TemplateModule::refungible_item_id(1, 1).owner[0],311 Ownership {312 owner: 2,313 fraction: 500314 }315 );316 assert_eq!(317 TemplateModule::refungible_item_id(1, 1).owner[1],318 Ownership {319 owner: 3,320 fraction: 500321 }322 );323 assert_eq!(TemplateModule::balance_count(1, 2), 500);324 assert_eq!(TemplateModule::balance_count(1, 3), 500);325 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);326 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);327328 // split item and new owner has account scenario329 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));330 assert_eq!(331 TemplateModule::refungible_item_id(1, 1).owner[0],332 Ownership {333 owner: 2,334 fraction: 300335 }336 );337 assert_eq!(338 TemplateModule::refungible_item_id(1, 1).owner[1],339 Ownership {340 owner: 3,341 fraction: 700342 }343 );344 assert_eq!(TemplateModule::balance_count(1, 2), 300);345 assert_eq!(TemplateModule::balance_count(1, 3), 700);346 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);347 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);348 });349}350351#[test]352fn transfer_nft_item() {353 new_test_ext().execute_with(|| {354 default_limits();355 356 let collection_id = create_test_collection(&CollectionMode::NFT, 1);357358 let data = default_nft_data();359 create_test_item(collection_id, &data.into());360 assert_eq!(TemplateModule::balance_count(1, 1), 1);361 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);362363 let origin1 = Origin::signed(1);364 // default scenario365 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));366 assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);367 assert_eq!(TemplateModule::balance_count(1, 1), 0);368 assert_eq!(TemplateModule::balance_count(1, 2), 1);369 // assert_eq!(TemplateModule::address_tokens(1, 1), []);370 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);371 });372}373374#[test]375fn nft_approve_and_transfer_from() {376 new_test_ext().execute_with(|| {377 default_limits();378 379 let collection_id = create_test_collection(&CollectionMode::NFT, 1);380381 let data = default_nft_data();382 create_test_item(collection_id, &data.into());383384 let origin1 = Origin::signed(1);385 let origin2 = Origin::signed(2);386387 assert_eq!(TemplateModule::balance_count(1, 1), 1);388 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);389390 // neg transfer391 assert_noop!(TemplateModule::transfer_from(392 origin2.clone(),393 1,394 2,395 1,396 1,397 1), Error::<Test>::NoPermission);398399 // do approve400 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));401 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);402 assert_eq!(403 TemplateModule::approved(1, (1, 1))[0],404 ApprovePermissions {405 approved: 2,406 amount: 100000000407 }408 );409410 assert_ok!(TemplateModule::transfer_from(411 origin2.clone(),412 1,413 2,414 1,415 1,416 1417 ));418 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);419 });420}421422#[test]423fn nft_approve_and_transfer_from_white_list() {424 new_test_ext().execute_with(|| {425 default_limits();426 427 let collection_id = create_test_collection(&CollectionMode::NFT, 1);428429 let origin1 = Origin::signed(1);430 let origin2 = Origin::signed(2);431432 let data = default_nft_data();433 create_test_item(collection_id, &data.clone().into());434435 assert_eq!(TemplateModule::nft_item_id(1, 1).const_data, data.const_data);436 assert_eq!(TemplateModule::balance_count(1, 1), 1);437 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);438439 assert_ok!(TemplateModule::set_mint_permission(440 origin1.clone(),441 1,442 true443 ));444 assert_ok!(TemplateModule::set_public_access_mode(445 origin1.clone(),446 1,447 AccessMode::WhiteList448 ));449 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));450 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));451 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));452453 // do approve454 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));455 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);456 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));457 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);458 assert_eq!(459 TemplateModule::approved(1, (1, 1))[0],460 ApprovePermissions {461 approved: 2,462 amount: 100000000463 }464 );465466 assert_ok!(TemplateModule::transfer_from(467 origin2.clone(),468 1,469 3,470 1,471 1,472 1473 ));474 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);475 });476}477478#[test]479fn refungible_approve_and_transfer_from() {480 new_test_ext().execute_with(|| {481 default_limits();482 483 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);484 485 let origin1 = Origin::signed(1);486 let origin2 = Origin::signed(2);487488 let data = default_re_fungible_data();489 create_test_item(collection_id, &data.into());490491 assert_eq!(TemplateModule::balance_count(1, 1), 1000);492 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);493494 assert_ok!(TemplateModule::set_mint_permission(495 origin1.clone(),496 1,497 true498 ));499 assert_ok!(TemplateModule::set_public_access_mode(500 origin1.clone(),501 1,502 AccessMode::WhiteList503 ));504 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));505 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));506 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));507508 // do approve509 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));510 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);511 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));512 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);513 assert_eq!(514 TemplateModule::approved(1, (1, 1))[0],515 ApprovePermissions {516 approved: 2,517 amount: 100000000518 }519 );520521 assert_ok!(TemplateModule::transfer_from(522 origin2.clone(),523 1,524 3,525 1,526 1,527 100528 ));529 assert_eq!(TemplateModule::balance_count(1, 1), 900);530 assert_eq!(TemplateModule::balance_count(1, 3), 100);531 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);532 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);533534 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);535 assert_eq!(536 TemplateModule::approved(1, (1, 1))[0],537 ApprovePermissions {538 approved: 3,539 amount: 100000000540 }541 );542 });543}544545#[test]546fn fungible_approve_and_transfer_from() {547 new_test_ext().execute_with(|| {548 default_limits();549 550 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);551 552 let data = default_fungible_data();553 create_test_item(collection_id, &data.into());554555 let origin1 = Origin::signed(1);556 let origin2 = Origin::signed(2);557558 assert_eq!(TemplateModule::balance_count(1, 1), 1000);559 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);560561 assert_ok!(TemplateModule::set_mint_permission(562 origin1.clone(),563 1,564 true565 ));566 assert_ok!(TemplateModule::set_public_access_mode(567 origin1.clone(),568 1,569 AccessMode::WhiteList570 ));571 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));572 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));573 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));574575 // do approve576 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));577 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);578 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));579 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);580 assert_eq!(581 TemplateModule::approved(1, (1, 1))[0],582 ApprovePermissions {583 approved: 2,584 amount: 100000000585 }586 );587588 assert_ok!(TemplateModule::transfer_from(589 origin2.clone(),590 1,591 3,592 1,593 1,594 100595 ));596 assert_eq!(TemplateModule::balance_count(1, 1), 900);597 assert_eq!(TemplateModule::balance_count(1, 3), 100);598 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);599 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);600601 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);602 assert_eq!(603 TemplateModule::approved(1, (1, 1))[0],604 ApprovePermissions {605 approved: 3,606 amount: 100000000607 }608 );609610 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));611 assert_ok!(TemplateModule::transfer_from(612 origin2.clone(),613 1,614 3,615 1,616 1,617 900618 ));619 assert_eq!(TemplateModule::balance_count(1, 1), 0);620 assert_eq!(TemplateModule::balance_count(1, 3), 1000);621 // assert_eq!(TemplateModule::address_tokens(1, 1), []);622 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);623624 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);625 });626}627628#[test]629fn change_collection_owner() {630 new_test_ext().execute_with(|| {631 default_limits();632 633 let collection_id = create_test_collection(&CollectionMode::NFT, 1);634 635 let origin1 = Origin::signed(1);636 assert_ok!(TemplateModule::change_collection_owner(637 origin1.clone(),638 collection_id,639 2640 ));641 assert_eq!(TemplateModule::collection(collection_id).owner, 2);642 });643}644645#[test]646fn destroy_collection() {647 new_test_ext().execute_with(|| {648 default_limits();649 650 let collection_id = create_test_collection(&CollectionMode::NFT, 1);651 652 let origin1 = Origin::signed(1);653 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));654 });655}656657#[test]658fn burn_nft_item() {659 new_test_ext().execute_with(|| {660 default_limits();661 662 let collection_id = create_test_collection(&CollectionMode::NFT, 1);663664 let origin1 = Origin::signed(1);665 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));666 667 let data = default_nft_data();668 create_test_item(collection_id, &data.into());669670 // check balance (collection with id = 1, user id = 1)671 assert_eq!(TemplateModule::balance_count(1, 1), 1);672673 // burn item674 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));675 assert_noop!(676 TemplateModule::burn_item(origin1.clone(), 1, 1),677 Error::<Test>::TokenNotFound678 );679680 assert_eq!(TemplateModule::balance_count(1, 1), 0);681 });682}683684#[test]685fn burn_fungible_item() {686 new_test_ext().execute_with(|| {687 default_limits();688 689 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);690 691 let origin1 = Origin::signed(1);692 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));693 694 let data = default_fungible_data();695 create_test_item(collection_id, &data.into());696697 // check balance (collection with id = 1, user id = 1)698 assert_eq!(TemplateModule::balance_count(1, 1), 1000);699700 // burn item701 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));702 assert_noop!(703 TemplateModule::burn_item(origin1.clone(), 1, 1),704 Error::<Test>::TokenNotFound705 );706707 assert_eq!(TemplateModule::balance_count(1, 1), 0);708 });709}710711#[test]712fn burn_refungible_item() {713 new_test_ext().execute_with(|| {714 default_limits();715 716 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);717 let origin1 = Origin::signed(1);718719 assert_ok!(TemplateModule::set_mint_permission(720 origin1.clone(),721 collection_id,722 true723 ));724 assert_ok!(TemplateModule::set_public_access_mode(725 origin1.clone(),726 collection_id,727 AccessMode::WhiteList728 ));729 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));730731 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));732 733 let data = default_re_fungible_data();734 create_test_item(collection_id, &data.into());735736 // check balance (collection with id = 1, user id = 2)737 assert_eq!(TemplateModule::balance_count(1, 1), 1000);738739 // burn item740 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));741 assert_noop!(742 TemplateModule::burn_item(origin1.clone(), 1, 1),743 Error::<Test>::TokenNotFound744 );745746 assert_eq!(TemplateModule::balance_count(1, 1), 0);747 });748}749750#[test]751fn add_collection_admin() {752 new_test_ext().execute_with(|| {753 default_limits();754 755 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);756 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);757 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);758 759 let origin1 = Origin::signed(1);760761 // collection admin762 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));763 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));764765 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&2), true);766 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&3), true);767 });768}769770#[test]771fn remove_collection_admin() {772 new_test_ext().execute_with(|| {773 default_limits();774 775 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);776 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);777 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);778779 let origin1 = Origin::signed(1);780 let origin2 = Origin::signed(2);781782 // collection admin783 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));784 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));785786 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);787 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);788789 // remove admin790 assert_ok!(TemplateModule::remove_collection_admin(791 origin2.clone(),792 1,793 3794 ));795 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);796 });797}798799#[test]800fn balance_of() {801 new_test_ext().execute_with(|| {802 default_limits();803 804 let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);805 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);806 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3), 3);807 808 // check balance before809 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);810 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);811 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 0);812813 let nft_data = default_nft_data();814 create_test_item(nft_collection_id, &nft_data.into());815 816 let fungible_data = default_fungible_data();817 create_test_item(fungible_collection_id, &fungible_data.into());818 819 let re_fungible_data = default_re_fungible_data();820 create_test_item(re_fungible_collection_id, &re_fungible_data.into());821822 // check balance (collection with id = 1, user id = 1)823 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);824 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 1000);825 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1000);826 assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1);827 assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).owner, 1);828 assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1);829 });830}831832#[test]833fn approve() {834 new_test_ext().execute_with(|| {835 default_limits();836 837 let collection_id = create_test_collection(&CollectionMode::NFT, 1);838 839 let data = default_nft_data();840 create_test_item(collection_id, &data.into());841842 let origin1 = Origin::signed(1);843 844 // approve845 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));846 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);847 });848}849850#[test]851fn transfer_from() {852 new_test_ext().execute_with(|| {853 default_limits();854 855 let collection_id = create_test_collection(&CollectionMode::NFT, 1);856 let origin1 = Origin::signed(1);857 let origin2 = Origin::signed(2);858859 let data = default_nft_data();860 create_test_item(collection_id, &data.into());861862 // approve863 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));864 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);865866 assert_ok!(TemplateModule::set_mint_permission(867 origin1.clone(),868 1,869 true870 ));871 assert_ok!(TemplateModule::set_public_access_mode(872 origin1.clone(),873 1,874 AccessMode::WhiteList875 ));876 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));877 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));878 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));879880 assert_ok!(TemplateModule::transfer_from(881 origin2.clone(),882 1,883 2,884 1,885 1,886 1887 ));888889 // after transfer890 assert_eq!(TemplateModule::balance_count(1, 1), 0);891 assert_eq!(TemplateModule::balance_count(1, 2), 1);892 });893}894895// #endregion896897// Coverage tests region898// #region899900#[test]901fn owner_can_add_address_to_white_list() {902 new_test_ext().execute_with(|| {903 default_limits();904 905 let collection_id = create_test_collection(&CollectionMode::NFT, 1);906907 let origin1 = Origin::signed(1);908 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));909 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);910 });911}912913#[test]914fn admin_can_add_address_to_white_list() {915 new_test_ext().execute_with(|| {916 default_limits();917 918 let collection_id = create_test_collection(&CollectionMode::NFT, 1);919 let origin1 = Origin::signed(1);920 let origin2 = Origin::signed(2);921922 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));923 assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3));924 assert_eq!(TemplateModule::white_list(collection_id)[0], 3);925 });926}927928#[test]929fn nonprivileged_user_cannot_add_address_to_white_list() {930 new_test_ext().execute_with(|| {931 default_limits();932 933 let collection_id = create_test_collection(&CollectionMode::NFT, 1);934935 let origin2 = Origin::signed(2);936 assert_noop!(937 TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3),938 Error::<Test>::NoPermission939 );940 });941}942943#[test]944fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {945 new_test_ext().execute_with(|| {946 default_limits();947948 let origin1 = Origin::signed(1);949950 assert_noop!(951 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),952 Error::<Test>::CollectionNotFound953 );954 });955}956957#[test]958fn nobody_can_add_address_to_white_list_of_deleted_collection() {959 new_test_ext().execute_with(|| {960 default_limits();961 962 let collection_id = create_test_collection(&CollectionMode::NFT, 1);963964 let origin1 = Origin::signed(1);965 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));966 assert_noop!(967 TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2),968 Error::<Test>::CollectionNotFound969 );970 });971}972973// If address is already added to white list, nothing happens974#[test]975fn address_is_already_added_to_white_list() {976 new_test_ext().execute_with(|| {977 default_limits();978 979 let collection_id = create_test_collection(&CollectionMode::NFT, 1);980 let origin1 = Origin::signed(1);981 982 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));983 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));984 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);985 assert_eq!(TemplateModule::white_list(collection_id).len(), 1);986 });987}988989#[test]990fn owner_can_remove_address_from_white_list() {991 new_test_ext().execute_with(|| {992 default_limits();993 994 let collection_id = create_test_collection(&CollectionMode::NFT, 1);995996 let origin1 = Origin::signed(1);997 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));998 assert_ok!(TemplateModule::remove_from_white_list(999 origin1.clone(),1000 collection_id,1001 21002 ));1003 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1004 });1005}10061007#[test]1008fn admin_can_remove_address_from_white_list() {1009 new_test_ext().execute_with(|| {1010 default_limits();1011 1012 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1013 let origin1 = Origin::signed(1);1014 let origin2 = Origin::signed(2);10151016 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));10171018 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 3));1019 assert_ok!(TemplateModule::remove_from_white_list(1020 origin2.clone(),1021 collection_id,1022 31023 ));1024 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1025 });1026}10271028#[test]1029fn nonprivileged_user_cannot_remove_address_from_white_list() {1030 new_test_ext().execute_with(|| {1031 default_limits();1032 1033 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1034 let origin1 = Origin::signed(1);1035 let origin2 = Origin::signed(2);10361037 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1038 assert_noop!(1039 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1040 Error::<Test>::NoPermission1041 );1042 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1043 });1044}10451046#[test]1047fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1048 new_test_ext().execute_with(|| {1049 default_limits();1050 let origin1 = Origin::signed(1);10511052 assert_noop!(1053 TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),1054 Error::<Test>::CollectionNotFound1055 );1056 });1057}10581059#[test]1060fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1061 new_test_ext().execute_with(|| {1062 default_limits();1063 1064 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1065 let origin1 = Origin::signed(1);1066 let origin2 = Origin::signed(2);10671068 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1069 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1070 assert_noop!(1071 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1072 Error::<Test>::CollectionNotFound1073 );1074 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1075 });1076}10771078// If address is already removed from white list, nothing happens1079#[test]1080fn address_is_already_removed_from_white_list() {1081 new_test_ext().execute_with(|| {1082 default_limits();1083 1084 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1085 let origin1 = Origin::signed(1);10861087 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1088 assert_ok!(TemplateModule::remove_from_white_list(1089 origin1.clone(),1090 collection_id,1091 21092 ));1093 assert_ok!(TemplateModule::remove_from_white_list(1094 origin1.clone(),1095 collection_id,1096 21097 ));1098 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1099 });1100}11011102// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1103#[test]1104fn white_list_test_1() {1105 new_test_ext().execute_with(|| {1106 default_limits();1107 1108 let collection_id = create_test_collection(&CollectionMode::NFT, 1);11091110 let origin1 = Origin::signed(1);1111 1112 let data = default_nft_data();1113 create_test_item(collection_id, &data.into());11141115 assert_ok!(TemplateModule::set_public_access_mode(1116 origin1.clone(),1117 collection_id,1118 AccessMode::WhiteList1119 ));1120 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));11211122 assert_noop!(1123 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1124 Error::<Test>::AddresNotInWhiteList1125 );1126 });1127}11281129#[test]1130fn white_list_test_2() {1131 new_test_ext().execute_with(|| {1132 default_limits();1133 1134 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1135 let origin1 = Origin::signed(1);1136 1137 let data = default_nft_data();1138 create_test_item(collection_id, &data.into());11391140 assert_ok!(TemplateModule::set_public_access_mode(1141 origin1.clone(),1142 collection_id,1143 AccessMode::WhiteList1144 ));1145 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1146 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));11471148 // do approve1149 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1150 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);11511152 assert_ok!(TemplateModule::remove_from_white_list(1153 origin1.clone(),1154 1,1155 11156 ));11571158 assert_noop!(1159 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1160 Error::<Test>::AddresNotInWhiteList1161 );1162 });1163}11641165// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1166#[test]1167fn white_list_test_3() {1168 new_test_ext().execute_with(|| {1169 default_limits();1170 1171 let collection_id = create_test_collection(&CollectionMode::NFT, 1);11721173 let origin1 = Origin::signed(1);1174 1175 let data = default_nft_data();1176 create_test_item(collection_id, &data.into());11771178 assert_ok!(TemplateModule::set_public_access_mode(1179 origin1.clone(),1180 collection_id,1181 AccessMode::WhiteList1182 ));1183 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));11841185 assert_noop!(1186 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1187 Error::<Test>::AddresNotInWhiteList1188 );1189 });1190}11911192#[test]1193fn white_list_test_4() {1194 new_test_ext().execute_with(|| {1195 default_limits();1196 1197 let collection_id = create_test_collection(&CollectionMode::NFT, 1);11981199 let origin1 = Origin::signed(1);12001201 let data = default_nft_data();1202 create_test_item(collection_id, &data.into());12031204 assert_ok!(TemplateModule::set_public_access_mode(1205 origin1.clone(),1206 collection_id,1207 AccessMode::WhiteList1208 ));1209 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1210 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));12111212 // do approve1213 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1214 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);12151216 assert_ok!(TemplateModule::remove_from_white_list(1217 origin1.clone(),1218 collection_id,1219 21220 ));12211222 assert_noop!(1223 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1224 Error::<Test>::AddresNotInWhiteList1225 );1226 });1227}12281229// 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)1230#[test]1231fn white_list_test_5() {1232 new_test_ext().execute_with(|| {1233 default_limits();1234 1235 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12361237 let origin1 = Origin::signed(1);12381239 let data = default_nft_data();1240 create_test_item(collection_id, &data.into());12411242 assert_ok!(TemplateModule::set_public_access_mode(1243 origin1.clone(),1244 collection_id,1245 AccessMode::WhiteList1246 ));1247 assert_noop!(1248 TemplateModule::burn_item(origin1.clone(), 1, 1),1249 Error::<Test>::AddresNotInWhiteList1250 );1251 });1252}12531254// If Public Access mode is set to WhiteList, oken transfers can’t be Approved by a non-whitelisted address (see Approve method).1255#[test]1256fn white_list_test_6() {1257 new_test_ext().execute_with(|| {1258 default_limits();1259 1260 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12611262 let origin1 = Origin::signed(1);1263 assert_ok!(TemplateModule::set_public_access_mode(1264 origin1.clone(),1265 collection_id,1266 AccessMode::WhiteList1267 ));12681269 // do approve1270 assert_noop!(1271 TemplateModule::approve(origin1.clone(), 1, 1, 1),1272 Error::<Test>::AddresNotInWhiteList1273 );1274 });1275}12761277// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1278// tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1279#[test]1280fn white_list_test_7() {1281 new_test_ext().execute_with(|| {1282 default_limits();1283 1284 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12851286 let data = default_nft_data();1287 create_test_item(collection_id, &data.into());1288 1289 let origin1 = Origin::signed(1);12901291 assert_ok!(TemplateModule::set_public_access_mode(1292 origin1.clone(),1293 collection_id,1294 AccessMode::WhiteList1295 ));1296 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1297 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));12981299 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1300 });1301}13021303#[test]1304fn white_list_test_8() {1305 new_test_ext().execute_with(|| {1306 default_limits();1307 1308 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13091310 let data = default_nft_data();1311 create_test_item(collection_id, &data.into());1312 1313 let origin1 = Origin::signed(1);13141315 assert_ok!(TemplateModule::set_public_access_mode(1316 origin1.clone(),1317 collection_id,1318 AccessMode::WhiteList1319 ));1320 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1321 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13221323 // do approve1324 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1325 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);13261327 assert_ok!(TemplateModule::transfer_from(1328 origin1.clone(),1329 1,1330 2,1331 1,1332 1,1333 11334 ));1335 });1336}13371338// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1339#[test]1340fn white_list_test_9() {1341 new_test_ext().execute_with(|| {1342 default_limits();1343 1344 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1345 let origin1 = Origin::signed(1);13461347 assert_ok!(TemplateModule::set_public_access_mode(1348 origin1.clone(),1349 collection_id,1350 AccessMode::WhiteList1351 ));1352 assert_ok!(TemplateModule::set_mint_permission(1353 origin1.clone(),1354 collection_id,1355 false1356 ));13571358 let data = default_nft_data();1359 create_test_item(collection_id, &data.into());1360 });1361}13621363// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1364#[test]1365fn white_list_test_10() {1366 new_test_ext().execute_with(|| {1367 default_limits();1368 1369 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13701371 let origin1 = Origin::signed(1);1372 let origin2 = Origin::signed(2);13731374 assert_ok!(TemplateModule::set_public_access_mode(1375 origin1.clone(),1376 collection_id,1377 AccessMode::WhiteList1378 ));1379 assert_ok!(TemplateModule::set_mint_permission(1380 origin1.clone(),1381 collection_id,1382 false1383 ));13841385 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));13861387 assert_ok!(TemplateModule::create_item(1388 origin2.clone(),1389 collection_id,1390 2,1391 default_nft_data().into()1392 ));1393 });1394}13951396// 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.1397#[test]1398fn white_list_test_11() {1399 new_test_ext().execute_with(|| {1400 default_limits();1401 1402 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14031404 let origin1 = Origin::signed(1);1405 let origin2 = Origin::signed(2);14061407 assert_ok!(TemplateModule::set_public_access_mode(1408 origin1.clone(),1409 collection_id,1410 AccessMode::WhiteList1411 ));1412 assert_ok!(TemplateModule::set_mint_permission(1413 origin1.clone(),1414 collection_id,1415 false1416 ));1417 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));14181419 assert_noop!(1420 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1421 Error::<Test>::PublicMintingNotAllowed1422 );1423 });1424}14251426// 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.1427#[test]1428fn white_list_test_12() {1429 new_test_ext().execute_with(|| {1430 default_limits();1431 1432 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14331434 let origin1 = Origin::signed(1);1435 let origin2 = Origin::signed(2);14361437 assert_ok!(TemplateModule::set_public_access_mode(1438 origin1.clone(),1439 collection_id,1440 AccessMode::WhiteList1441 ));1442 assert_ok!(TemplateModule::set_mint_permission(1443 origin1.clone(),1444 collection_id,1445 false1446 ));14471448 assert_noop!(1449 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1450 Error::<Test>::PublicMintingNotAllowed1451 );1452 });1453}14541455// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1456#[test]1457fn white_list_test_13() {1458 new_test_ext().execute_with(|| {1459 default_limits();1460 1461 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14621463 let origin1 = Origin::signed(1);14641465 assert_ok!(TemplateModule::set_public_access_mode(1466 origin1.clone(),1467 collection_id,1468 AccessMode::WhiteList1469 ));1470 assert_ok!(TemplateModule::set_mint_permission(1471 origin1.clone(),1472 collection_id,1473 true1474 ));14751476 let data = default_nft_data();1477 create_test_item(collection_id, &data.into());1478 });1479}14801481// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1482#[test]1483fn white_list_test_14() {1484 new_test_ext().execute_with(|| {1485 default_limits();1486 1487 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14881489 let origin1 = Origin::signed(1);1490 let origin2 = Origin::signed(2);14911492 assert_ok!(TemplateModule::set_public_access_mode(1493 origin1.clone(),1494 collection_id,1495 AccessMode::WhiteList1496 ));1497 assert_ok!(TemplateModule::set_mint_permission(1498 origin1.clone(),1499 collection_id,1500 true1501 ));15021503 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));15041505 assert_ok!(TemplateModule::create_item(1506 origin2.clone(),1507 1,1508 2,1509 default_nft_data().into()1510 ));1511 });1512}15131514// 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.1515#[test]1516fn white_list_test_15() {1517 new_test_ext().execute_with(|| {1518 default_limits();1519 1520 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15211522 let origin1 = Origin::signed(1);1523 let origin2 = Origin::signed(2);15241525 assert_ok!(TemplateModule::set_public_access_mode(1526 origin1.clone(),1527 collection_id,1528 AccessMode::WhiteList1529 ));1530 assert_ok!(TemplateModule::set_mint_permission(1531 origin1.clone(),1532 collection_id,1533 true1534 ));15351536 assert_noop!(1537 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1538 Error::<Test>::AddresNotInWhiteList1539 );1540 });1541}15421543// 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.1544#[test]1545fn white_list_test_16() {1546 new_test_ext().execute_with(|| {1547 default_limits();1548 1549 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15501551 let origin1 = Origin::signed(1);1552 let origin2 = Origin::signed(2);15531554 assert_ok!(TemplateModule::set_public_access_mode(1555 origin1.clone(),1556 collection_id,1557 AccessMode::WhiteList1558 ));1559 assert_ok!(TemplateModule::set_mint_permission(1560 origin1.clone(),1561 collection_id,1562 true1563 ));1564 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));15651566 assert_ok!(TemplateModule::create_item(1567 origin2.clone(),1568 1,1569 2,1570 default_nft_data().into()1571 ));1572 });1573}15741575// Total number of collections. Positive test1576#[test]1577fn total_number_collections_bound() {1578 new_test_ext().execute_with(|| {1579 default_limits();1580 1581 create_test_collection(&CollectionMode::NFT, 1);1582 });1583}15841585// Total number of collections. Negotive test1586#[test]1587fn total_number_collections_bound_neg() {1588 new_test_ext().execute_with(|| {1589 default_limits();15901591 let origin1 = Origin::signed(1);15921593 for i in 0..default_collection_numbers_limit() {1594 create_test_collection(&CollectionMode::NFT, i + 1);1595 }15961597 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1598 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1599 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();16001601 // 11-th collection in chain. Expects error1602 assert_noop!(TemplateModule::create_collection(1603 origin1.clone(),1604 col_name1.clone(),1605 col_desc1.clone(),1606 token_prefix1.clone(),1607 CollectionMode::NFT1608 ), Error::<Test>::TotalCollectionsLimitExceeded);1609 });1610}16111612// Owned tokens by a single address. Positive test1613#[test]1614fn owned_tokens_bound() {1615 new_test_ext().execute_with(|| {1616 default_limits();1617 1618 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16191620 let data = default_nft_data();1621 create_test_item(collection_id, &data.clone().into());1622 create_test_item(collection_id, &data.into());1623 });1624}16251626// Owned tokens by a single address. Negotive test1627#[test]1628fn owned_tokens_bound_neg() {1629 new_test_ext().execute_with(|| {1630 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1631 collection_numbers_limit: 10,1632 account_token_ownership_limit: 1,1633 collections_admins_limit: 5,1634 custom_data_limit: 2048,1635 nft_sponsor_transfer_timeout: 15,1636 fungible_sponsor_transfer_timeout: 15,1637 refungible_sponsor_transfer_timeout: 15, 1638 }));1639 1640 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16411642 let origin1 = Origin::signed(1);1643 let data = default_nft_data();1644 create_test_item(collection_id, &data.clone().into());16451646 assert_noop!(TemplateModule::create_item(1647 origin1.clone(),1648 1,1649 1,1650 data.into()1651 ), Error::<Test>::AddressOwnershipLimitExceeded);1652 });1653}16541655// Number of collection admins. Positive test1656#[test]1657fn collection_admins_bound() {1658 new_test_ext().execute_with(|| {1659 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1660 collection_numbers_limit: 10,1661 account_token_ownership_limit: 10,1662 collections_admins_limit: 2,1663 custom_data_limit: 2048,1664 nft_sponsor_transfer_timeout: 15,1665 fungible_sponsor_transfer_timeout: 15,1666 refungible_sponsor_transfer_timeout: 15, 1667 }));1668 1669 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16701671 let origin1 = Origin::signed(1);1672 1673 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1674 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3));1675 });1676}16771678// Number of collection admins. Negotive test1679#[test]1680fn collection_admins_bound_neg() {1681 new_test_ext().execute_with(|| {1682 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1683 collection_numbers_limit: 10,1684 account_token_ownership_limit: 1,1685 collections_admins_limit: 1,1686 custom_data_limit: 2048,1687 nft_sponsor_transfer_timeout: 15,1688 fungible_sponsor_transfer_timeout: 15,1689 refungible_sponsor_transfer_timeout: 15, 1690 }));1691 1692 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16931694 let origin1 = Origin::signed(1);16951696 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1697 assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3), Error::<Test>::CollectionAdminsLimitExceeded);1698 });1699}17001701// NFT custom data size. Negative test const_data.1702#[test]1703fn custom_data_size_nft_const_data_bound_neg() {1704 new_test_ext().execute_with(|| {1705 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1706 collection_numbers_limit: 10,1707 account_token_ownership_limit: 10,1708 collections_admins_limit: 5,1709 custom_data_limit: 2,1710 nft_sponsor_transfer_timeout: 15,1711 fungible_sponsor_transfer_timeout: 15,1712 refungible_sponsor_transfer_timeout: 15, 1713 }));1714 1715 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17161717 let origin1 = Origin::signed(1);1718 let too_big_const_data = CreateItemData::NFT(CreateNftData{1719 const_data: vec![1, 2, 3, 4],1720 variable_data: vec![]1721 });17221723 assert_noop!(TemplateModule::create_item(1724 origin1.clone(),1725 collection_id,1726 1,1727 too_big_const_data1728 ), Error::<Test>::TokenConstDataLimitExceeded);1729 });1730}17311732// NFT custom data size. Negative test variable_data.1733#[test]1734fn custom_data_size_nft_variable_data_bound_neg() {1735 new_test_ext().execute_with(|| {1736 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1737 collection_numbers_limit: 10,1738 account_token_ownership_limit: 10,1739 collections_admins_limit: 5,1740 custom_data_limit: 2,1741 nft_sponsor_transfer_timeout: 15,1742 fungible_sponsor_transfer_timeout: 15,1743 refungible_sponsor_transfer_timeout: 15, 1744 }));17451746 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17471748 let origin1 = Origin::signed(1);1749 let too_big_const_data = CreateItemData::NFT(CreateNftData{1750 const_data: vec![],1751 variable_data: vec![1, 2, 3, 4]1752 });17531754 assert_noop!(TemplateModule::create_item(1755 origin1.clone(),1756 collection_id,1757 1,1758 too_big_const_data1759 ), Error::<Test>::TokenVariableDataLimitExceeded);1760 });1761}17621763// Re fungible custom data size. Negative test const_data.1764#[test]1765fn custom_data_size_re_fungible_const_data_bound_neg() {1766 new_test_ext().execute_with(|| {1767 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1768 collection_numbers_limit: 10,1769 account_token_ownership_limit: 10,1770 collections_admins_limit: 5,1771 custom_data_limit: 2,1772 nft_sponsor_transfer_timeout: 15,1773 fungible_sponsor_transfer_timeout: 15,1774 refungible_sponsor_transfer_timeout: 15, 1775 }));17761777 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17781779 let origin1 = Origin::signed(1);1780 let too_big_const_data = CreateItemData::NFT(CreateNftData{1781 const_data: vec![1, 2, 3, 4],1782 variable_data: vec![]1783 });17841785 assert_noop!(TemplateModule::create_item(1786 origin1.clone(),1787 collection_id,1788 1,1789 too_big_const_data1790 ), Error::<Test>::TokenConstDataLimitExceeded);1791 });1792}17931794// Re fungible custom data size. Negative test variable_data.1795#[test]1796fn custom_data_size_re_fungible_variable_data_bound_neg() {1797 new_test_ext().execute_with(|| {1798 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1799 collection_numbers_limit: 10,1800 account_token_ownership_limit: 10,1801 collections_admins_limit: 5,1802 custom_data_limit: 2,1803 nft_sponsor_transfer_timeout: 15,1804 fungible_sponsor_transfer_timeout: 15,1805 refungible_sponsor_transfer_timeout: 15, 1806 }));18071808 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18091810 let origin1 = Origin::signed(1);1811 let too_big_const_data = CreateItemData::NFT(CreateNftData{1812 const_data: vec![],1813 variable_data: vec![1, 2, 3, 4]1814 });18151816 assert_noop!(TemplateModule::create_item(1817 origin1.clone(),1818 collection_id,1819 1,1820 too_big_const_data1821 ), Error::<Test>::TokenVariableDataLimitExceeded);1822 });1823}1824// #endregion18251826#[test]1827fn set_const_on_chain_schema() {1828 new_test_ext().execute_with(|| {1829 default_limits();18301831 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18321833 let origin1 = Origin::signed(1);1834 assert_ok!(TemplateModule::set_const_on_chain_schema(origin1, collection_id, b"test const on chain schema".to_vec()));18351836 assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"test const on chain schema".to_vec());1837 assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"".to_vec());1838 });1839}18401841#[test]1842fn set_variable_on_chain_schema() {1843 new_test_ext().execute_with(|| {1844 default_limits();1845 1846 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18471848 let origin1 = Origin::signed(1);1849 assert_ok!(TemplateModule::set_variable_on_chain_schema(origin1, collection_id, b"test variable on chain schema".to_vec()));18501851 assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"".to_vec());1852 assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"test variable on chain schema".to_vec());1853 });1854}18551856#[test]1857fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1858 new_test_ext().execute_with(|| {1859 default_limits();18601861 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18621863 let origin1 = Origin::signed(1);1864 1865 let data = default_nft_data();1866 create_test_item(1, &data.into());1867 1868 let variable_data = b"test set_variable_meta_data method.".to_vec();1869 assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));18701871 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, variable_data);1872 });1873}18741875#[test]1876fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1877 new_test_ext().execute_with(|| {1878 default_limits();18791880 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);18811882 let origin1 = Origin::signed(1);18831884 let data = default_re_fungible_data();1885 create_test_item(1, &data.into());18861887 let variable_data = b"test set_variable_meta_data method.".to_vec();1888 assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));18891890 assert_eq!(TemplateModule::refungible_item_id(collection_id, 1).variable_data, variable_data);1891 });1892}189318941895#[test]1896fn set_variable_meta_data_on_fungible_token_fails() {1897 new_test_ext().execute_with(|| {1898 default_limits();18991900 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);19011902 let origin1 = Origin::signed(1);19031904 let data = default_fungible_data();1905 create_test_item(1, &data.into());19061907 let variable_data = b"test set_variable_meta_data method.".to_vec();1908 assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()), Error::<Test>::CantStoreMetadataInFungibleTokens);1909 });1910}19111912#[test]1913fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1914 new_test_ext().execute_with(|| {1915 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1916 collection_numbers_limit: default_collection_numbers_limit(),1917 account_token_ownership_limit: 10,1918 collections_admins_limit: 5,1919 custom_data_limit: 10,1920 nft_sponsor_transfer_timeout: 15,1921 fungible_sponsor_transfer_timeout: 15,1922 refungible_sponsor_transfer_timeout: 15, 1923 }));19241925 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19261927 let origin1 = Origin::signed(1);19281929 let data = default_nft_data();1930 create_test_item(1, &data.into());19311932 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1933 assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1934 });1935}19361937#[test]1938fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1939 new_test_ext().execute_with(|| {1940 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1941 collection_numbers_limit: default_collection_numbers_limit(),1942 account_token_ownership_limit: 10,1943 collections_admins_limit: 5,1944 custom_data_limit: 10,1945 nft_sponsor_transfer_timeout: 15,1946 fungible_sponsor_transfer_timeout: 15,1947 refungible_sponsor_transfer_timeout: 15, 1948 }));194919501951 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);19521953 let origin1 = Origin::signed(1);19541955 let data = default_re_fungible_data();1956 create_test_item(1, &data.into());19571958 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1959 assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1960 });1961}1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, ApprovePermissions, CollectionMode,5 Ownership, ChainLimits, CreateItemData, CreateNftData, CreateFungibleData, CreateReFungibleData,6 CollectionId, TokenId}; //Err7use frame_support::{assert_noop, assert_ok};8use frame_system::{ RawOrigin };910fn default_collection_numbers_limit() -> u32 {11 1012}1314fn default_limits() {15 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 16 collection_numbers_limit: default_collection_numbers_limit(),17 account_token_ownership_limit: 10,18 collections_admins_limit: 5,19 custom_data_limit: 2048,20 nft_sponsor_transfer_timeout: 15,21 fungible_sponsor_transfer_timeout: 15,22 refungible_sponsor_transfer_timeout: 15, 23 }));24}2526fn default_nft_data() -> CreateNftData {27 CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }28}2930fn default_fungible_data () -> CreateFungibleData {31 CreateFungibleData { }32}3334fn default_re_fungible_data () -> CreateReFungibleData {35 CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }36}3738fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64, id: CollectionId) -> CollectionId {39 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();40 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();41 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4243 let origin1 = Origin::signed(owner);44 assert_ok!(TemplateModule::create_collection(45 origin1.clone(),46 col_name1.clone(),47 col_desc1.clone(),48 token_prefix1.clone(),49 mode.clone()50 ));5152 let saved_col_name: Vec<u16> = "Test1\0\0".encode_utf16().collect::<Vec<u16>>();53 let saved_description: Vec<u16> = "TestDescription1\0\0".encode_utf16().collect::<Vec<u16>>();54 let saved_prefix: Vec<u8> = b"token_prefix1\0\0".to_vec();55 assert_eq!(TemplateModule::collection(id).owner, owner);56 assert_eq!(TemplateModule::collection(id).name, saved_col_name);57 assert_eq!(TemplateModule::collection(id).mode, *mode);58 assert_eq!(TemplateModule::collection(id).description, saved_description);59 assert_eq!(TemplateModule::collection(id).token_prefix, saved_prefix);60 id61}6263fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {64 create_test_collection_for_owner(&mode, 1, id)65}6667fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {68 let origin1 = Origin::signed(1);69 assert_ok!(TemplateModule::create_item(70 origin1.clone(),71 collection_id,72 1,73 data.clone()74 ));7576}7778// Use cases tests region79// #region80#[test]81fn create_nft_item() {82 new_test_ext().execute_with(|| {83 default_limits();84 let collection_id = create_test_collection(&CollectionMode::NFT, 1);85 86 let data = default_nft_data();87 create_test_item(collection_id, &data.clone().into());88 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).const_data, data.const_data);89 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, data.variable_data);90 });91}9293// Use cases tests region94// #region95#[test]96fn create_nft_multiple_items() {97 new_test_ext().execute_with(|| {98 default_limits();99 100 create_test_collection(&CollectionMode::NFT, 1);101102 let origin1 = Origin::signed(1);103104 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];105106 assert_ok!(TemplateModule::create_multiple_items(107 origin1.clone(),108 1,109 1,110 items_data.clone().into_iter().map(|d| { d.into() }).collect()111 ));112 for (index, data) in items_data.iter().enumerate() {113 assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).const_data.to_vec(), data.const_data);114 assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).variable_data.to_vec(), data.variable_data);115 }116 });117}118119#[test]120fn create_refungible_item() {121 new_test_ext().execute_with(|| {122 default_limits();123 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);124125 let data = default_re_fungible_data();126 create_test_item(collection_id, &data.clone().into());127 assert_eq!(128 TemplateModule::refungible_item_id(collection_id, 1).const_data,129 data.const_data130 );131 assert_eq!(132 TemplateModule::refungible_item_id(collection_id, 1).variable_data,133 data.variable_data134 );135 assert_eq!(136 TemplateModule::refungible_item_id(collection_id, 1).owner[0],137 Ownership {138 owner: 1,139 fraction: 1000140 }141 );142 });143}144145#[test]146fn create_multiple_refungible_items() {147 new_test_ext().execute_with(|| {148 default_limits();149 150 create_test_collection(&CollectionMode::ReFungible(3), 1);151152 let origin1 = Origin::signed(1);153154 let items_data = vec![default_re_fungible_data(), default_re_fungible_data(), default_re_fungible_data()];155156 assert_ok!(TemplateModule::create_multiple_items(157 origin1.clone(),158 1,159 1,160 items_data.clone().into_iter().map(|d| { d.into() }).collect()161 ));162 for (index, data) in items_data.iter().enumerate() {163164 let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId);165 assert_eq!(item.const_data.to_vec(), data.const_data);166 assert_eq!(item.variable_data.to_vec(), data.variable_data);167 assert_eq!(168 item.owner[0],169 Ownership {170 owner: 1,171 fraction: 1000172 }173 );174 }175 });176}177178#[test]179fn create_fungible_item() {180 new_test_ext().execute_with(|| {181 default_limits();182 183 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);184185 let data = default_fungible_data();186 create_test_item(collection_id, &data.into());187188 assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).owner, 1);189 });190}191192#[test]193fn create_multiple_fungible_items() {194 new_test_ext().execute_with(|| {195 default_limits();196197 create_test_collection(&CollectionMode::Fungible(3), 1);198199 let origin1 = Origin::signed(1);200201 let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];202203 assert_ok!(TemplateModule::create_multiple_items(204 origin1.clone(),205 1,206 1,207 items_data.clone().into_iter().map(|d| { d.into() }).collect()208 ));209 210 for (index, _) in items_data.iter().enumerate() {211 assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).owner, 1);212 }213 assert_eq!(TemplateModule::balance_count(1, 1), 3000);214 assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);215 });216}217218#[test]219fn transfer_fungible_item() {220 new_test_ext().execute_with(|| {221 default_limits();222 223 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);224225 let origin1 = Origin::signed(1);226 let origin2 = Origin::signed(2);227228 let data = default_fungible_data();229 create_test_item(collection_id, &data.into());230231 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);232 assert_eq!(TemplateModule::balance_count(1, 1), 1000);233 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);234235 // change owner scenario236 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));237 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);238 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 1000);239 assert_eq!(TemplateModule::balance_count(1, 1), 0);240 assert_eq!(TemplateModule::balance_count(1, 2), 1000);241 // assert_eq!(TemplateModule::address_tokens(1, 1), []);242 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);243244 // split item scenario245 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));246 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);247 assert_eq!(TemplateModule::fungible_item_id(1, 2).owner, 3);248 assert_eq!(TemplateModule::balance_count(1, 2), 500);249 assert_eq!(TemplateModule::balance_count(1, 3), 500);250 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);251 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);252253 // split item and new owner has account scenario254 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));255 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 300);256 assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 700);257 assert_eq!(TemplateModule::balance_count(1, 2), 300);258 assert_eq!(TemplateModule::balance_count(1, 3), 700);259 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);260 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);261 });262}263264#[test]265fn transfer_refungible_item() {266 new_test_ext().execute_with(|| {267 default_limits();268 269 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);270271 let data = default_re_fungible_data();272 create_test_item(collection_id, &data.clone().into());273274 let origin1 = Origin::signed(1);275 let origin2 = Origin::signed(2);276 assert_eq!(277 TemplateModule::refungible_item_id(collection_id, 1).const_data,278 data.const_data279 );280 assert_eq!(281 TemplateModule::refungible_item_id(collection_id, 1).variable_data,282 data.variable_data283 );284 assert_eq!(285 TemplateModule::refungible_item_id(collection_id, 1).owner[0],286 Ownership {287 owner: 1,288 fraction: 1000289 }290 );291 assert_eq!(TemplateModule::balance_count(1, 1), 1000);292 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);293294 // change owner scenario295 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));296 assert_eq!(297 TemplateModule::refungible_item_id(1, 1).owner[0],298 Ownership {299 owner: 2,300 fraction: 1000301 }302 );303 assert_eq!(TemplateModule::balance_count(1, 1), 0);304 assert_eq!(TemplateModule::balance_count(1, 2), 1000);305 // assert_eq!(TemplateModule::address_tokens(1, 1), []);306 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);307308 // split item scenario309 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));310 assert_eq!(311 TemplateModule::refungible_item_id(1, 1).owner[0],312 Ownership {313 owner: 2,314 fraction: 500315 }316 );317 assert_eq!(318 TemplateModule::refungible_item_id(1, 1).owner[1],319 Ownership {320 owner: 3,321 fraction: 500322 }323 );324 assert_eq!(TemplateModule::balance_count(1, 2), 500);325 assert_eq!(TemplateModule::balance_count(1, 3), 500);326 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);327 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);328329 // split item and new owner has account scenario330 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));331 assert_eq!(332 TemplateModule::refungible_item_id(1, 1).owner[0],333 Ownership {334 owner: 2,335 fraction: 300336 }337 );338 assert_eq!(339 TemplateModule::refungible_item_id(1, 1).owner[1],340 Ownership {341 owner: 3,342 fraction: 700343 }344 );345 assert_eq!(TemplateModule::balance_count(1, 2), 300);346 assert_eq!(TemplateModule::balance_count(1, 3), 700);347 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);348 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);349 });350}351352#[test]353fn transfer_nft_item() {354 new_test_ext().execute_with(|| {355 default_limits();356 357 let collection_id = create_test_collection(&CollectionMode::NFT, 1);358359 let data = default_nft_data();360 create_test_item(collection_id, &data.into());361 assert_eq!(TemplateModule::balance_count(1, 1), 1);362 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);363364 let origin1 = Origin::signed(1);365 // default scenario366 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));367 assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);368 assert_eq!(TemplateModule::balance_count(1, 1), 0);369 assert_eq!(TemplateModule::balance_count(1, 2), 1);370 // assert_eq!(TemplateModule::address_tokens(1, 1), []);371 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);372 });373}374375#[test]376fn nft_approve_and_transfer_from() {377 new_test_ext().execute_with(|| {378 default_limits();379 380 let collection_id = create_test_collection(&CollectionMode::NFT, 1);381382 let data = default_nft_data();383 create_test_item(collection_id, &data.into());384385 let origin1 = Origin::signed(1);386 let origin2 = Origin::signed(2);387388 assert_eq!(TemplateModule::balance_count(1, 1), 1);389 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);390391 // neg transfer392 assert_noop!(TemplateModule::transfer_from(393 origin2.clone(),394 1,395 2,396 1,397 1,398 1), Error::<Test>::NoPermission);399400 // do approve401 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));402 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);403 assert_eq!(404 TemplateModule::approved(1, (1, 1))[0],405 ApprovePermissions {406 approved: 2,407 amount: 100000000408 }409 );410411 assert_ok!(TemplateModule::transfer_from(412 origin2.clone(),413 1,414 2,415 1,416 1,417 1418 ));419 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);420 });421}422423#[test]424fn nft_approve_and_transfer_from_white_list() {425 new_test_ext().execute_with(|| {426 default_limits();427 428 let collection_id = create_test_collection(&CollectionMode::NFT, 1);429430 let origin1 = Origin::signed(1);431 let origin2 = Origin::signed(2);432433 let data = default_nft_data();434 create_test_item(collection_id, &data.clone().into());435436 assert_eq!(TemplateModule::nft_item_id(1, 1).const_data, data.const_data);437 assert_eq!(TemplateModule::balance_count(1, 1), 1);438 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);439440 assert_ok!(TemplateModule::set_mint_permission(441 origin1.clone(),442 1,443 true444 ));445 assert_ok!(TemplateModule::set_public_access_mode(446 origin1.clone(),447 1,448 AccessMode::WhiteList449 ));450 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));451 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));452 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));453454 // do approve455 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));456 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);457 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));458 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);459 assert_eq!(460 TemplateModule::approved(1, (1, 1))[0],461 ApprovePermissions {462 approved: 2,463 amount: 100000000464 }465 );466467 assert_ok!(TemplateModule::transfer_from(468 origin2.clone(),469 1,470 3,471 1,472 1,473 1474 ));475 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);476 });477}478479#[test]480fn refungible_approve_and_transfer_from() {481 new_test_ext().execute_with(|| {482 default_limits();483 484 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);485 486 let origin1 = Origin::signed(1);487 let origin2 = Origin::signed(2);488489 let data = default_re_fungible_data();490 create_test_item(collection_id, &data.into());491492 assert_eq!(TemplateModule::balance_count(1, 1), 1000);493 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);494495 assert_ok!(TemplateModule::set_mint_permission(496 origin1.clone(),497 1,498 true499 ));500 assert_ok!(TemplateModule::set_public_access_mode(501 origin1.clone(),502 1,503 AccessMode::WhiteList504 ));505 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));506 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));507 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));508509 // do approve510 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));511 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);512 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));513 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);514 assert_eq!(515 TemplateModule::approved(1, (1, 1))[0],516 ApprovePermissions {517 approved: 2,518 amount: 100000000519 }520 );521522 assert_ok!(TemplateModule::transfer_from(523 origin2.clone(),524 1,525 3,526 1,527 1,528 100529 ));530 assert_eq!(TemplateModule::balance_count(1, 1), 900);531 assert_eq!(TemplateModule::balance_count(1, 3), 100);532 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);533 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);534535 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);536 assert_eq!(537 TemplateModule::approved(1, (1, 1))[0],538 ApprovePermissions {539 approved: 3,540 amount: 100000000541 }542 );543 });544}545546#[test]547fn fungible_approve_and_transfer_from() {548 new_test_ext().execute_with(|| {549 default_limits();550 551 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);552 553 let data = default_fungible_data();554 create_test_item(collection_id, &data.into());555556 let origin1 = Origin::signed(1);557 let origin2 = Origin::signed(2);558559 assert_eq!(TemplateModule::balance_count(1, 1), 1000);560 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);561562 assert_ok!(TemplateModule::set_mint_permission(563 origin1.clone(),564 1,565 true566 ));567 assert_ok!(TemplateModule::set_public_access_mode(568 origin1.clone(),569 1,570 AccessMode::WhiteList571 ));572 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));573 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));574 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));575576 // do approve577 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));578 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);579 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));580 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);581 assert_eq!(582 TemplateModule::approved(1, (1, 1))[0],583 ApprovePermissions {584 approved: 2,585 amount: 100000000586 }587 );588589 assert_ok!(TemplateModule::transfer_from(590 origin2.clone(),591 1,592 3,593 1,594 1,595 100596 ));597 assert_eq!(TemplateModule::balance_count(1, 1), 900);598 assert_eq!(TemplateModule::balance_count(1, 3), 100);599 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);600 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);601602 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);603 assert_eq!(604 TemplateModule::approved(1, (1, 1))[0],605 ApprovePermissions {606 approved: 3,607 amount: 100000000608 }609 );610611 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));612 assert_ok!(TemplateModule::transfer_from(613 origin2.clone(),614 1,615 3,616 1,617 1,618 900619 ));620 assert_eq!(TemplateModule::balance_count(1, 1), 0);621 assert_eq!(TemplateModule::balance_count(1, 3), 1000);622 // assert_eq!(TemplateModule::address_tokens(1, 1), []);623 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);624625 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);626 });627}628629#[test]630fn change_collection_owner() {631 new_test_ext().execute_with(|| {632 default_limits();633 634 let collection_id = create_test_collection(&CollectionMode::NFT, 1);635 636 let origin1 = Origin::signed(1);637 assert_ok!(TemplateModule::change_collection_owner(638 origin1.clone(),639 collection_id,640 2641 ));642 assert_eq!(TemplateModule::collection(collection_id).owner, 2);643 });644}645646#[test]647fn destroy_collection() {648 new_test_ext().execute_with(|| {649 default_limits();650 651 let collection_id = create_test_collection(&CollectionMode::NFT, 1);652 653 let origin1 = Origin::signed(1);654 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));655 });656}657658#[test]659fn burn_nft_item() {660 new_test_ext().execute_with(|| {661 default_limits();662 663 let collection_id = create_test_collection(&CollectionMode::NFT, 1);664665 let origin1 = Origin::signed(1);666 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));667 668 let data = default_nft_data();669 create_test_item(collection_id, &data.into());670671 // check balance (collection with id = 1, user id = 1)672 assert_eq!(TemplateModule::balance_count(1, 1), 1);673674 // burn item675 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));676 assert_noop!(677 TemplateModule::burn_item(origin1.clone(), 1, 1),678 Error::<Test>::TokenNotFound679 );680681 assert_eq!(TemplateModule::balance_count(1, 1), 0);682 });683}684685#[test]686fn burn_fungible_item() {687 new_test_ext().execute_with(|| {688 default_limits();689 690 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);691 692 let origin1 = Origin::signed(1);693 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));694 695 let data = default_fungible_data();696 create_test_item(collection_id, &data.into());697698 // check balance (collection with id = 1, user id = 1)699 assert_eq!(TemplateModule::balance_count(1, 1), 1000);700701 // burn item702 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));703 assert_noop!(704 TemplateModule::burn_item(origin1.clone(), 1, 1),705 Error::<Test>::TokenNotFound706 );707708 assert_eq!(TemplateModule::balance_count(1, 1), 0);709 });710}711712#[test]713fn burn_refungible_item() {714 new_test_ext().execute_with(|| {715 default_limits();716 717 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);718 let origin1 = Origin::signed(1);719720 assert_ok!(TemplateModule::set_mint_permission(721 origin1.clone(),722 collection_id,723 true724 ));725 assert_ok!(TemplateModule::set_public_access_mode(726 origin1.clone(),727 collection_id,728 AccessMode::WhiteList729 ));730 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));731732 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));733 734 let data = default_re_fungible_data();735 create_test_item(collection_id, &data.into());736737 // check balance (collection with id = 1, user id = 2)738 assert_eq!(TemplateModule::balance_count(1, 1), 1000);739740 // burn item741 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));742 assert_noop!(743 TemplateModule::burn_item(origin1.clone(), 1, 1),744 Error::<Test>::TokenNotFound745 );746747 assert_eq!(TemplateModule::balance_count(1, 1), 0);748 });749}750751#[test]752fn add_collection_admin() {753 new_test_ext().execute_with(|| {754 default_limits();755 756 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);757 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);758 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);759 760 let origin1 = Origin::signed(1);761762 // collection admin763 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));764 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));765766 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&2), true);767 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&3), true);768 });769}770771#[test]772fn remove_collection_admin() {773 new_test_ext().execute_with(|| {774 default_limits();775 776 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);777 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);778 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);779780 let origin1 = Origin::signed(1);781 let origin2 = Origin::signed(2);782783 // collection admin784 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));785 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));786787 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);788 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);789790 // remove admin791 assert_ok!(TemplateModule::remove_collection_admin(792 origin2.clone(),793 1,794 3795 ));796 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);797 });798}799800#[test]801fn balance_of() {802 new_test_ext().execute_with(|| {803 default_limits();804 805 let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);806 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);807 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3), 3);808 809 // check balance before810 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);811 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);812 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 0);813814 let nft_data = default_nft_data();815 create_test_item(nft_collection_id, &nft_data.into());816 817 let fungible_data = default_fungible_data();818 create_test_item(fungible_collection_id, &fungible_data.into());819 820 let re_fungible_data = default_re_fungible_data();821 create_test_item(re_fungible_collection_id, &re_fungible_data.into());822823 // check balance (collection with id = 1, user id = 1)824 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);825 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 1000);826 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1000);827 assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1);828 assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).owner, 1);829 assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1);830 });831}832833#[test]834fn approve() {835 new_test_ext().execute_with(|| {836 default_limits();837 838 let collection_id = create_test_collection(&CollectionMode::NFT, 1);839 840 let data = default_nft_data();841 create_test_item(collection_id, &data.into());842843 let origin1 = Origin::signed(1);844 845 // approve846 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));847 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);848 });849}850851#[test]852fn transfer_from() {853 new_test_ext().execute_with(|| {854 default_limits();855 856 let collection_id = create_test_collection(&CollectionMode::NFT, 1);857 let origin1 = Origin::signed(1);858 let origin2 = Origin::signed(2);859860 let data = default_nft_data();861 create_test_item(collection_id, &data.into());862863 // approve864 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));865 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);866867 assert_ok!(TemplateModule::set_mint_permission(868 origin1.clone(),869 1,870 true871 ));872 assert_ok!(TemplateModule::set_public_access_mode(873 origin1.clone(),874 1,875 AccessMode::WhiteList876 ));877 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));878 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));879 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));880881 assert_ok!(TemplateModule::transfer_from(882 origin2.clone(),883 1,884 2,885 1,886 1,887 1888 ));889890 // after transfer891 assert_eq!(TemplateModule::balance_count(1, 1), 0);892 assert_eq!(TemplateModule::balance_count(1, 2), 1);893 });894}895896// #endregion897898// Coverage tests region899// #region900901#[test]902fn owner_can_add_address_to_white_list() {903 new_test_ext().execute_with(|| {904 default_limits();905 906 let collection_id = create_test_collection(&CollectionMode::NFT, 1);907908 let origin1 = Origin::signed(1);909 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));910 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);911 });912}913914#[test]915fn admin_can_add_address_to_white_list() {916 new_test_ext().execute_with(|| {917 default_limits();918 919 let collection_id = create_test_collection(&CollectionMode::NFT, 1);920 let origin1 = Origin::signed(1);921 let origin2 = Origin::signed(2);922923 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));924 assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3));925 assert_eq!(TemplateModule::white_list(collection_id)[0], 3);926 });927}928929#[test]930fn nonprivileged_user_cannot_add_address_to_white_list() {931 new_test_ext().execute_with(|| {932 default_limits();933 934 let collection_id = create_test_collection(&CollectionMode::NFT, 1);935936 let origin2 = Origin::signed(2);937 assert_noop!(938 TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3),939 Error::<Test>::NoPermission940 );941 });942}943944#[test]945fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {946 new_test_ext().execute_with(|| {947 default_limits();948949 let origin1 = Origin::signed(1);950951 assert_noop!(952 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),953 Error::<Test>::CollectionNotFound954 );955 });956}957958#[test]959fn nobody_can_add_address_to_white_list_of_deleted_collection() {960 new_test_ext().execute_with(|| {961 default_limits();962 963 let collection_id = create_test_collection(&CollectionMode::NFT, 1);964965 let origin1 = Origin::signed(1);966 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));967 assert_noop!(968 TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2),969 Error::<Test>::CollectionNotFound970 );971 });972}973974// If address is already added to white list, nothing happens975#[test]976fn address_is_already_added_to_white_list() {977 new_test_ext().execute_with(|| {978 default_limits();979 980 let collection_id = create_test_collection(&CollectionMode::NFT, 1);981 let origin1 = Origin::signed(1);982 983 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));984 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));985 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);986 assert_eq!(TemplateModule::white_list(collection_id).len(), 1);987 });988}989990#[test]991fn owner_can_remove_address_from_white_list() {992 new_test_ext().execute_with(|| {993 default_limits();994 995 let collection_id = create_test_collection(&CollectionMode::NFT, 1);996997 let origin1 = Origin::signed(1);998 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));999 assert_ok!(TemplateModule::remove_from_white_list(1000 origin1.clone(),1001 collection_id,1002 21003 ));1004 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1005 });1006}10071008#[test]1009fn admin_can_remove_address_from_white_list() {1010 new_test_ext().execute_with(|| {1011 default_limits();1012 1013 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1014 let origin1 = Origin::signed(1);1015 let origin2 = Origin::signed(2);10161017 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));10181019 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 3));1020 assert_ok!(TemplateModule::remove_from_white_list(1021 origin2.clone(),1022 collection_id,1023 31024 ));1025 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1026 });1027}10281029#[test]1030fn nonprivileged_user_cannot_remove_address_from_white_list() {1031 new_test_ext().execute_with(|| {1032 default_limits();1033 1034 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1035 let origin1 = Origin::signed(1);1036 let origin2 = Origin::signed(2);10371038 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1039 assert_noop!(1040 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1041 Error::<Test>::NoPermission1042 );1043 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1044 });1045}10461047#[test]1048fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1049 new_test_ext().execute_with(|| {1050 default_limits();1051 let origin1 = Origin::signed(1);10521053 assert_noop!(1054 TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),1055 Error::<Test>::CollectionNotFound1056 );1057 });1058}10591060#[test]1061fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1062 new_test_ext().execute_with(|| {1063 default_limits();1064 1065 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1066 let origin1 = Origin::signed(1);1067 let origin2 = Origin::signed(2);10681069 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1070 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1071 assert_noop!(1072 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1073 Error::<Test>::CollectionNotFound1074 );1075 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1076 });1077}10781079// If address is already removed from white list, nothing happens1080#[test]1081fn address_is_already_removed_from_white_list() {1082 new_test_ext().execute_with(|| {1083 default_limits();1084 1085 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1086 let origin1 = Origin::signed(1);10871088 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1089 assert_ok!(TemplateModule::remove_from_white_list(1090 origin1.clone(),1091 collection_id,1092 21093 ));1094 assert_ok!(TemplateModule::remove_from_white_list(1095 origin1.clone(),1096 collection_id,1097 21098 ));1099 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1100 });1101}11021103// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1104#[test]1105fn white_list_test_1() {1106 new_test_ext().execute_with(|| {1107 default_limits();1108 1109 let collection_id = create_test_collection(&CollectionMode::NFT, 1);11101111 let origin1 = Origin::signed(1);1112 1113 let data = default_nft_data();1114 create_test_item(collection_id, &data.into());11151116 assert_ok!(TemplateModule::set_public_access_mode(1117 origin1.clone(),1118 collection_id,1119 AccessMode::WhiteList1120 ));1121 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));11221123 assert_noop!(1124 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1125 Error::<Test>::AddresNotInWhiteList1126 );1127 });1128}11291130#[test]1131fn white_list_test_2() {1132 new_test_ext().execute_with(|| {1133 default_limits();1134 1135 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1136 let origin1 = Origin::signed(1);1137 1138 let data = default_nft_data();1139 create_test_item(collection_id, &data.into());11401141 assert_ok!(TemplateModule::set_public_access_mode(1142 origin1.clone(),1143 collection_id,1144 AccessMode::WhiteList1145 ));1146 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1147 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));11481149 // do approve1150 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1151 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);11521153 assert_ok!(TemplateModule::remove_from_white_list(1154 origin1.clone(),1155 1,1156 11157 ));11581159 assert_noop!(1160 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1161 Error::<Test>::AddresNotInWhiteList1162 );1163 });1164}11651166// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1167#[test]1168fn white_list_test_3() {1169 new_test_ext().execute_with(|| {1170 default_limits();1171 1172 let collection_id = create_test_collection(&CollectionMode::NFT, 1);11731174 let origin1 = Origin::signed(1);1175 1176 let data = default_nft_data();1177 create_test_item(collection_id, &data.into());11781179 assert_ok!(TemplateModule::set_public_access_mode(1180 origin1.clone(),1181 collection_id,1182 AccessMode::WhiteList1183 ));1184 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));11851186 assert_noop!(1187 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1188 Error::<Test>::AddresNotInWhiteList1189 );1190 });1191}11921193#[test]1194fn white_list_test_4() {1195 new_test_ext().execute_with(|| {1196 default_limits();1197 1198 let collection_id = create_test_collection(&CollectionMode::NFT, 1);11991200 let origin1 = Origin::signed(1);12011202 let data = default_nft_data();1203 create_test_item(collection_id, &data.into());12041205 assert_ok!(TemplateModule::set_public_access_mode(1206 origin1.clone(),1207 collection_id,1208 AccessMode::WhiteList1209 ));1210 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1211 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));12121213 // do approve1214 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1215 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);12161217 assert_ok!(TemplateModule::remove_from_white_list(1218 origin1.clone(),1219 collection_id,1220 21221 ));12221223 assert_noop!(1224 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1225 Error::<Test>::AddresNotInWhiteList1226 );1227 });1228}12291230// 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)1231#[test]1232fn white_list_test_5() {1233 new_test_ext().execute_with(|| {1234 default_limits();1235 1236 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12371238 let origin1 = Origin::signed(1);12391240 let data = default_nft_data();1241 create_test_item(collection_id, &data.into());12421243 assert_ok!(TemplateModule::set_public_access_mode(1244 origin1.clone(),1245 collection_id,1246 AccessMode::WhiteList1247 ));1248 assert_noop!(1249 TemplateModule::burn_item(origin1.clone(), 1, 1),1250 Error::<Test>::AddresNotInWhiteList1251 );1252 });1253}12541255// If Public Access mode is set to WhiteList, oken transfers can’t be Approved by a non-whitelisted address (see Approve method).1256#[test]1257fn white_list_test_6() {1258 new_test_ext().execute_with(|| {1259 default_limits();1260 1261 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12621263 let origin1 = Origin::signed(1);1264 assert_ok!(TemplateModule::set_public_access_mode(1265 origin1.clone(),1266 collection_id,1267 AccessMode::WhiteList1268 ));12691270 // do approve1271 assert_noop!(1272 TemplateModule::approve(origin1.clone(), 1, 1, 1),1273 Error::<Test>::AddresNotInWhiteList1274 );1275 });1276}12771278// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1279// tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1280#[test]1281fn white_list_test_7() {1282 new_test_ext().execute_with(|| {1283 default_limits();1284 1285 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12861287 let data = default_nft_data();1288 create_test_item(collection_id, &data.into());1289 1290 let origin1 = Origin::signed(1);12911292 assert_ok!(TemplateModule::set_public_access_mode(1293 origin1.clone(),1294 collection_id,1295 AccessMode::WhiteList1296 ));1297 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1298 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));12991300 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1301 });1302}13031304#[test]1305fn white_list_test_8() {1306 new_test_ext().execute_with(|| {1307 default_limits();1308 1309 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13101311 let data = default_nft_data();1312 create_test_item(collection_id, &data.into());1313 1314 let origin1 = Origin::signed(1);13151316 assert_ok!(TemplateModule::set_public_access_mode(1317 origin1.clone(),1318 collection_id,1319 AccessMode::WhiteList1320 ));1321 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1322 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13231324 // do approve1325 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1326 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);13271328 assert_ok!(TemplateModule::transfer_from(1329 origin1.clone(),1330 1,1331 2,1332 1,1333 1,1334 11335 ));1336 });1337}13381339// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1340#[test]1341fn white_list_test_9() {1342 new_test_ext().execute_with(|| {1343 default_limits();1344 1345 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1346 let origin1 = Origin::signed(1);13471348 assert_ok!(TemplateModule::set_public_access_mode(1349 origin1.clone(),1350 collection_id,1351 AccessMode::WhiteList1352 ));1353 assert_ok!(TemplateModule::set_mint_permission(1354 origin1.clone(),1355 collection_id,1356 false1357 ));13581359 let data = default_nft_data();1360 create_test_item(collection_id, &data.into());1361 });1362}13631364// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1365#[test]1366fn white_list_test_10() {1367 new_test_ext().execute_with(|| {1368 default_limits();1369 1370 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13711372 let origin1 = Origin::signed(1);1373 let origin2 = Origin::signed(2);13741375 assert_ok!(TemplateModule::set_public_access_mode(1376 origin1.clone(),1377 collection_id,1378 AccessMode::WhiteList1379 ));1380 assert_ok!(TemplateModule::set_mint_permission(1381 origin1.clone(),1382 collection_id,1383 false1384 ));13851386 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));13871388 assert_ok!(TemplateModule::create_item(1389 origin2.clone(),1390 collection_id,1391 2,1392 default_nft_data().into()1393 ));1394 });1395}13961397// 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.1398#[test]1399fn white_list_test_11() {1400 new_test_ext().execute_with(|| {1401 default_limits();1402 1403 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14041405 let origin1 = Origin::signed(1);1406 let origin2 = Origin::signed(2);14071408 assert_ok!(TemplateModule::set_public_access_mode(1409 origin1.clone(),1410 collection_id,1411 AccessMode::WhiteList1412 ));1413 assert_ok!(TemplateModule::set_mint_permission(1414 origin1.clone(),1415 collection_id,1416 false1417 ));1418 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));14191420 assert_noop!(1421 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1422 Error::<Test>::PublicMintingNotAllowed1423 );1424 });1425}14261427// 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.1428#[test]1429fn white_list_test_12() {1430 new_test_ext().execute_with(|| {1431 default_limits();1432 1433 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14341435 let origin1 = Origin::signed(1);1436 let origin2 = Origin::signed(2);14371438 assert_ok!(TemplateModule::set_public_access_mode(1439 origin1.clone(),1440 collection_id,1441 AccessMode::WhiteList1442 ));1443 assert_ok!(TemplateModule::set_mint_permission(1444 origin1.clone(),1445 collection_id,1446 false1447 ));14481449 assert_noop!(1450 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1451 Error::<Test>::PublicMintingNotAllowed1452 );1453 });1454}14551456// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1457#[test]1458fn white_list_test_13() {1459 new_test_ext().execute_with(|| {1460 default_limits();1461 1462 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14631464 let origin1 = Origin::signed(1);14651466 assert_ok!(TemplateModule::set_public_access_mode(1467 origin1.clone(),1468 collection_id,1469 AccessMode::WhiteList1470 ));1471 assert_ok!(TemplateModule::set_mint_permission(1472 origin1.clone(),1473 collection_id,1474 true1475 ));14761477 let data = default_nft_data();1478 create_test_item(collection_id, &data.into());1479 });1480}14811482// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1483#[test]1484fn white_list_test_14() {1485 new_test_ext().execute_with(|| {1486 default_limits();1487 1488 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14891490 let origin1 = Origin::signed(1);1491 let origin2 = Origin::signed(2);14921493 assert_ok!(TemplateModule::set_public_access_mode(1494 origin1.clone(),1495 collection_id,1496 AccessMode::WhiteList1497 ));1498 assert_ok!(TemplateModule::set_mint_permission(1499 origin1.clone(),1500 collection_id,1501 true1502 ));15031504 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));15051506 assert_ok!(TemplateModule::create_item(1507 origin2.clone(),1508 1,1509 2,1510 default_nft_data().into()1511 ));1512 });1513}15141515// 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.1516#[test]1517fn white_list_test_15() {1518 new_test_ext().execute_with(|| {1519 default_limits();1520 1521 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15221523 let origin1 = Origin::signed(1);1524 let origin2 = Origin::signed(2);15251526 assert_ok!(TemplateModule::set_public_access_mode(1527 origin1.clone(),1528 collection_id,1529 AccessMode::WhiteList1530 ));1531 assert_ok!(TemplateModule::set_mint_permission(1532 origin1.clone(),1533 collection_id,1534 true1535 ));15361537 assert_noop!(1538 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1539 Error::<Test>::AddresNotInWhiteList1540 );1541 });1542}15431544// 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.1545#[test]1546fn white_list_test_16() {1547 new_test_ext().execute_with(|| {1548 default_limits();1549 1550 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15511552 let origin1 = Origin::signed(1);1553 let origin2 = Origin::signed(2);15541555 assert_ok!(TemplateModule::set_public_access_mode(1556 origin1.clone(),1557 collection_id,1558 AccessMode::WhiteList1559 ));1560 assert_ok!(TemplateModule::set_mint_permission(1561 origin1.clone(),1562 collection_id,1563 true1564 ));1565 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));15661567 assert_ok!(TemplateModule::create_item(1568 origin2.clone(),1569 1,1570 2,1571 default_nft_data().into()1572 ));1573 });1574}15751576// Total number of collections. Positive test1577#[test]1578fn total_number_collections_bound() {1579 new_test_ext().execute_with(|| {1580 default_limits();1581 1582 create_test_collection(&CollectionMode::NFT, 1);1583 });1584}15851586// Total number of collections. Negotive test1587#[test]1588fn total_number_collections_bound_neg() {1589 new_test_ext().execute_with(|| {1590 default_limits();15911592 let origin1 = Origin::signed(1);15931594 for i in 0..default_collection_numbers_limit() {1595 create_test_collection(&CollectionMode::NFT, i + 1);1596 }15971598 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1599 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1600 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();16011602 // 11-th collection in chain. Expects error1603 assert_noop!(TemplateModule::create_collection(1604 origin1.clone(),1605 col_name1.clone(),1606 col_desc1.clone(),1607 token_prefix1.clone(),1608 CollectionMode::NFT1609 ), Error::<Test>::TotalCollectionsLimitExceeded);1610 });1611}16121613// Owned tokens by a single address. Positive test1614#[test]1615fn owned_tokens_bound() {1616 new_test_ext().execute_with(|| {1617 default_limits();1618 1619 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16201621 let data = default_nft_data();1622 create_test_item(collection_id, &data.clone().into());1623 create_test_item(collection_id, &data.into());1624 });1625}16261627// Owned tokens by a single address. Negotive test1628#[test]1629fn owned_tokens_bound_neg() {1630 new_test_ext().execute_with(|| {1631 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1632 collection_numbers_limit: 10,1633 account_token_ownership_limit: 1,1634 collections_admins_limit: 5,1635 custom_data_limit: 2048,1636 nft_sponsor_transfer_timeout: 15,1637 fungible_sponsor_transfer_timeout: 15,1638 refungible_sponsor_transfer_timeout: 15, 1639 }));1640 1641 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16421643 let origin1 = Origin::signed(1);1644 let data = default_nft_data();1645 create_test_item(collection_id, &data.clone().into());16461647 assert_noop!(TemplateModule::create_item(1648 origin1.clone(),1649 1,1650 1,1651 data.into()1652 ), Error::<Test>::AddressOwnershipLimitExceeded);1653 });1654}16551656// Number of collection admins. Positive test1657#[test]1658fn collection_admins_bound() {1659 new_test_ext().execute_with(|| {1660 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1661 collection_numbers_limit: 10,1662 account_token_ownership_limit: 10,1663 collections_admins_limit: 2,1664 custom_data_limit: 2048,1665 nft_sponsor_transfer_timeout: 15,1666 fungible_sponsor_transfer_timeout: 15,1667 refungible_sponsor_transfer_timeout: 15, 1668 }));1669 1670 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16711672 let origin1 = Origin::signed(1);1673 1674 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1675 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3));1676 });1677}16781679// Number of collection admins. Negotive test1680#[test]1681fn collection_admins_bound_neg() {1682 new_test_ext().execute_with(|| {1683 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1684 collection_numbers_limit: 10,1685 account_token_ownership_limit: 1,1686 collections_admins_limit: 1,1687 custom_data_limit: 2048,1688 nft_sponsor_transfer_timeout: 15,1689 fungible_sponsor_transfer_timeout: 15,1690 refungible_sponsor_transfer_timeout: 15, 1691 }));1692 1693 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16941695 let origin1 = Origin::signed(1);16961697 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1698 assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3), Error::<Test>::CollectionAdminsLimitExceeded);1699 });1700}17011702// NFT custom data size. Negative test const_data.1703#[test]1704fn custom_data_size_nft_const_data_bound_neg() {1705 new_test_ext().execute_with(|| {1706 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1707 collection_numbers_limit: 10,1708 account_token_ownership_limit: 10,1709 collections_admins_limit: 5,1710 custom_data_limit: 2,1711 nft_sponsor_transfer_timeout: 15,1712 fungible_sponsor_transfer_timeout: 15,1713 refungible_sponsor_transfer_timeout: 15, 1714 }));1715 1716 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17171718 let origin1 = Origin::signed(1);1719 let too_big_const_data = CreateItemData::NFT(CreateNftData{1720 const_data: vec![1, 2, 3, 4],1721 variable_data: vec![]1722 });17231724 assert_noop!(TemplateModule::create_item(1725 origin1.clone(),1726 collection_id,1727 1,1728 too_big_const_data1729 ), Error::<Test>::TokenConstDataLimitExceeded);1730 });1731}17321733// NFT custom data size. Negative test variable_data.1734#[test]1735fn custom_data_size_nft_variable_data_bound_neg() {1736 new_test_ext().execute_with(|| {1737 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1738 collection_numbers_limit: 10,1739 account_token_ownership_limit: 10,1740 collections_admins_limit: 5,1741 custom_data_limit: 2,1742 nft_sponsor_transfer_timeout: 15,1743 fungible_sponsor_transfer_timeout: 15,1744 refungible_sponsor_transfer_timeout: 15, 1745 }));17461747 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17481749 let origin1 = Origin::signed(1);1750 let too_big_const_data = CreateItemData::NFT(CreateNftData{1751 const_data: vec![],1752 variable_data: vec![1, 2, 3, 4]1753 });17541755 assert_noop!(TemplateModule::create_item(1756 origin1.clone(),1757 collection_id,1758 1,1759 too_big_const_data1760 ), Error::<Test>::TokenVariableDataLimitExceeded);1761 });1762}17631764// Re fungible custom data size. Negative test const_data.1765#[test]1766fn custom_data_size_re_fungible_const_data_bound_neg() {1767 new_test_ext().execute_with(|| {1768 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1769 collection_numbers_limit: 10,1770 account_token_ownership_limit: 10,1771 collections_admins_limit: 5,1772 custom_data_limit: 2,1773 nft_sponsor_transfer_timeout: 15,1774 fungible_sponsor_transfer_timeout: 15,1775 refungible_sponsor_transfer_timeout: 15, 1776 }));17771778 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17791780 let origin1 = Origin::signed(1);1781 let too_big_const_data = CreateItemData::NFT(CreateNftData{1782 const_data: vec![1, 2, 3, 4],1783 variable_data: vec![]1784 });17851786 assert_noop!(TemplateModule::create_item(1787 origin1.clone(),1788 collection_id,1789 1,1790 too_big_const_data1791 ), Error::<Test>::TokenConstDataLimitExceeded);1792 });1793}17941795// Re fungible custom data size. Negative test variable_data.1796#[test]1797fn custom_data_size_re_fungible_variable_data_bound_neg() {1798 new_test_ext().execute_with(|| {1799 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1800 collection_numbers_limit: 10,1801 account_token_ownership_limit: 10,1802 collections_admins_limit: 5,1803 custom_data_limit: 2,1804 nft_sponsor_transfer_timeout: 15,1805 fungible_sponsor_transfer_timeout: 15,1806 refungible_sponsor_transfer_timeout: 15, 1807 }));18081809 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18101811 let origin1 = Origin::signed(1);1812 let too_big_const_data = CreateItemData::NFT(CreateNftData{1813 const_data: vec![],1814 variable_data: vec![1, 2, 3, 4]1815 });18161817 assert_noop!(TemplateModule::create_item(1818 origin1.clone(),1819 collection_id,1820 1,1821 too_big_const_data1822 ), Error::<Test>::TokenVariableDataLimitExceeded);1823 });1824}1825// #endregion18261827#[test]1828fn set_const_on_chain_schema() {1829 new_test_ext().execute_with(|| {1830 default_limits();18311832 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18331834 let origin1 = Origin::signed(1);1835 assert_ok!(TemplateModule::set_const_on_chain_schema(origin1, collection_id, b"test const on chain schema".to_vec()));18361837 assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"test const on chain schema".to_vec());1838 assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"".to_vec());1839 });1840}18411842#[test]1843fn set_variable_on_chain_schema() {1844 new_test_ext().execute_with(|| {1845 default_limits();1846 1847 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18481849 let origin1 = Origin::signed(1);1850 assert_ok!(TemplateModule::set_variable_on_chain_schema(origin1, collection_id, b"test variable on chain schema".to_vec()));18511852 assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"".to_vec());1853 assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"test variable on chain schema".to_vec());1854 });1855}18561857#[test]1858fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1859 new_test_ext().execute_with(|| {1860 default_limits();18611862 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18631864 let origin1 = Origin::signed(1);1865 1866 let data = default_nft_data();1867 create_test_item(1, &data.into());1868 1869 let variable_data = b"test set_variable_meta_data method.".to_vec();1870 assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));18711872 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, variable_data);1873 });1874}18751876#[test]1877fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1878 new_test_ext().execute_with(|| {1879 default_limits();18801881 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);18821883 let origin1 = Origin::signed(1);18841885 let data = default_re_fungible_data();1886 create_test_item(1, &data.into());18871888 let variable_data = b"test set_variable_meta_data method.".to_vec();1889 assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));18901891 assert_eq!(TemplateModule::refungible_item_id(collection_id, 1).variable_data, variable_data);1892 });1893}189418951896#[test]1897fn set_variable_meta_data_on_fungible_token_fails() {1898 new_test_ext().execute_with(|| {1899 default_limits();19001901 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);19021903 let origin1 = Origin::signed(1);19041905 let data = default_fungible_data();1906 create_test_item(1, &data.into());19071908 let variable_data = b"test set_variable_meta_data method.".to_vec();1909 assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()), Error::<Test>::CantStoreMetadataInFungibleTokens);1910 });1911}19121913#[test]1914fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1915 new_test_ext().execute_with(|| {1916 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1917 collection_numbers_limit: default_collection_numbers_limit(),1918 account_token_ownership_limit: 10,1919 collections_admins_limit: 5,1920 custom_data_limit: 10,1921 nft_sponsor_transfer_timeout: 15,1922 fungible_sponsor_transfer_timeout: 15,1923 refungible_sponsor_transfer_timeout: 15, 1924 }));19251926 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19271928 let origin1 = Origin::signed(1);19291930 let data = default_nft_data();1931 create_test_item(1, &data.into());19321933 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1934 assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1935 });1936}19371938#[test]1939fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1940 new_test_ext().execute_with(|| {1941 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1942 collection_numbers_limit: default_collection_numbers_limit(),1943 account_token_ownership_limit: 10,1944 collections_admins_limit: 5,1945 custom_data_limit: 10,1946 nft_sponsor_transfer_timeout: 15,1947 fungible_sponsor_transfer_timeout: 15,1948 refungible_sponsor_transfer_timeout: 15, 1949 }));195019511952 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);19531954 let origin1 = Origin::signed(1);19551956 let data = default_re_fungible_data();1957 create_test_item(1, &data.into());19581959 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1960 assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1961 });1962}