difftreelog
Merge pull request #31 from usetech-llc/feature/NFTPAR-183
in: master
Feature/NFTPAR-183 Storage Refactoring.
3 files changed
README.mddiffbeforeafterboth--- a/README.md
+++ b/README.md
@@ -164,12 +164,13 @@
"WhiteList"
]
},
+ "DecimalPoints": "u8",
"CollectionMode": {
"_enum": {
"Invalid": null,
"NFT": null,
- "Fungible": "u32",
- "ReFungible": "u32"
+ "Fungible": "DecimalPoints",
+ "ReFungible": "DecimalPoints"
}
},
"Ownership": {
@@ -177,17 +178,17 @@
"Fraction": "u128"
},
"FungibleItemType": {
- "Collection": "u64",
+ "Collection": "CollectionId",
"Owner": "AccountId",
"Value": "u128"
},
"ReFungibleItemType": {
- "Collection": "u64",
+ "Collection": "CollectionId",
"Owner": "Vec<Ownership>",
"Data": "Vec<u8>"
},
"NftItemType": {
- "Collection": "u64",
+ "Collection": "CollectionId",
"Owner": "AccountId",
"ConstData": "Vec<u8>",
"VariableData": "Vec<u8>"
@@ -197,7 +198,7 @@
"fraction": "u128"
},
"ReFungibleItemType": {
- "Collection": "u64",
+ "Collection": "CollectionId",
"Owner": "Vec<Ownership<AccountId>>",
"ConstData": "Vec<u8>",
"VariableData": "Vec<u8>"
@@ -206,7 +207,7 @@
"Owner": "AccountId",
"Mode": "CollectionMode",
"Access": "AccessMode",
- "DecimalPoints": "u32",
+ "DecimalPoints": "DecimalPoints",
"Name": "Vec<u16>",
"Description": "Vec<u16>",
"TokenPrefix": "Vec<u8>",
@@ -219,7 +220,7 @@
},
"ApprovePermissions": {
"Approved": "AccountId",
- "Amount": "u64"
+ "Amount": "u128"
},
"RawData": "Vec<u8>",
"Address": "AccountId",
@@ -240,7 +241,9 @@
"Fungible": "CreateFungibleData",
"ReFungible": "CreateReFungibleData"
}
- }
+ },
+ "CollectionId": "u32",
+ "TokenId": "u32"
}
```
\ No newline at end of file
pallets/nft/src/lib.rsdiffbeforeafterboth--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -45,18 +45,25 @@
mod default_weights;
+pub const MAX_DECIMAL_POINTS: DecimalPoints = 30;
+
// Structs
// #region
+pub type CollectionId = u32;
+pub type TokenId = u32;
+
+pub type DecimalPoints = u8;
+
#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub enum CollectionMode {
Invalid,
NFT,
// decimal points
- Fungible(u32),
+ Fungible(DecimalPoints),
// decimal points
- ReFungible(u32),
+ ReFungible(DecimalPoints),
}
impl Into<u8> for CollectionMode {
@@ -101,7 +108,7 @@
pub owner: AccountId,
pub mode: CollectionMode,
pub access: AccessMode,
- pub decimal_points: u32,
+ pub decimal_points: DecimalPoints,
pub name: Vec<u16>, // 64 include null escape char
pub description: Vec<u16>, // 256 include null escape char
pub token_prefix: Vec<u8>, // 16 include null escape char
@@ -116,7 +123,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 +132,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 +140,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>,
@@ -143,7 +150,7 @@
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub struct ApprovePermissions<AccountId> {
pub approved: AccountId,
- pub amount: u64,
+ pub amount: u128,
}
#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
@@ -151,8 +158,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 +174,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,
@@ -266,7 +273,7 @@
pub enum Error for Module<T: Trait> {
/// Total collections bound exceeded.
TotalCollectionsLimitExceeded,
- /// Decimal_points parameter must be lower than 4.
+ /// Decimal_points parameter must be lower than MAX_DECIMAL_POINTS constant, currently it is 30.
CollectionDecimalPointLimitExceeded,
/// Collection name can not be longer than 63 char.
CollectionNameLimitExceeded,
@@ -341,41 +348,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(identity) 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(twox_64_concat) 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(identity) CollectionId, hasher(twox_64_concat) T::AccountId => u128;
/// 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(identity) CollectionId, hasher(twox_64_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(identity) CollectionId, hasher(identity) TokenId => NftItemType<T::AccountId>;
+ pub FungibleItemList get(fn fungible_item_id) config(): double_map hasher(identity) CollectionId, hasher(identity) TokenId => FungibleItemType<T::AccountId>;
+ pub ReFungibleItemList get(fn refungible_item_id) config(): double_map hasher(identity) CollectionId, hasher(identity) 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(identity) CollectionId, hasher(twox_64_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(identity) CollectionId, hasher(identity) TokenId => T::BlockNumber;
+ pub FungibleTransferBasket get(fn fungible_transfer_basket): double_map hasher(identity) CollectionId, hasher(identity) TokenId => Vec<BasketItem<T::AccountId, T::BlockNumber>>;
+ pub ReFungibleTransferBasket get(fn refungible_transfer_basket): double_map hasher(identity) CollectionId, hasher(identity) TokenId => T::BlockNumber;
// Contract Sponsorship and Ownership
pub ContractOwner get(fn contract_owner): map hasher(twox_64_concat) T::AccountId => T::AccountId;
@@ -419,7 +426,7 @@
/// * mode: [CollectionMode] converted into u8.
///
/// * account_id: Collection owner.
- Created(u64, u8, AccountId),
+ Created(CollectionId, u8, AccountId),
/// New item was created.
///
@@ -428,7 +435,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 +444,7 @@
/// collection_id.
///
/// item_id: Identifier of burned NFT.
- ItemDestroyed(u64, u64),
+ ItemDestroyed(CollectionId, TokenId),
}
);
@@ -495,7 +502,7 @@
ensure!(CollectionCount::get() < ChainLimit::get().collection_numbers_limit, Error::<T>::TotalCollectionsLimitExceeded);
// check params
- ensure!(decimal_points <= 4, Error::<T>::CollectionDecimalPointLimitExceeded);
+ ensure!(decimal_points <= MAX_DECIMAL_POINTS, Error::<T>::CollectionDecimalPointLimitExceeded);
let mut name = collection_name.to_vec();
name.push(0);
@@ -558,7 +565,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 +612,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 +647,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 +676,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 +702,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 +726,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 +751,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 +785,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 +810,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 +832,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 +857,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 +896,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 +932,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 +966,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 +1019,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: u128) -> DispatchResult {
let sender = ensure_signed(origin)?;
@@ -1054,7 +1061,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 +1119,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: u128 ) -> DispatchResult {
let sender = ensure_signed(origin)?;
let mut appoved_transfer = false;
@@ -1157,7 +1164,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 +1193,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 +1238,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 +1266,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 +1294,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 +1403,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 +1448,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) => {
@@ -1458,14 +1465,14 @@
let item = FungibleItemType {
collection: collection_id,
owner,
- value: (10 as u128).pow(collection.decimal_points)
+ value: (10 as u128).pow(collection.decimal_points as u32)
};
Self::add_fungible_item(item)?;
},
CreateItemData::ReFungible(data) => {
let mut owner_list = Vec::new();
- let value = (10 as u128).pow(collection.decimal_points);
+ let value = (10 as u128).pow(collection.decimal_points as u32);
owner_list.push(Ownership {owner: owner.clone(), fraction: value});
let item = ReFungibleItemType {
@@ -1492,7 +1499,6 @@
.ok_or(Error::<T>::NumOverflow)?;
let itemcopy = item.clone();
let owner = item.owner.clone();
- let value = item.value as u64;
Self::add_token_index(item.collection, current_index, owner.clone())?;
@@ -1505,7 +1511,7 @@
// Update balance
let new_balance = <Balance<T>>::get(item.collection, owner.clone())
- .checked_add(value)
+ .checked_add(item.value)
.ok_or(Error::<T>::NumOverflow)?;
<Balance<T>>::insert(item.collection, owner.clone(), new_balance);
@@ -1518,7 +1524,7 @@
.ok_or(Error::<T>::NumOverflow)?;
let itemcopy = item.clone();
- let value = item.owner.first().unwrap().fraction as u64;
+ let value = item.owner.first().unwrap().fraction;
let owner = item.owner.first().unwrap().owner.clone();
Self::add_token_index(item.collection, current_index, owner.clone())?;
@@ -1565,8 +1571,8 @@
}
fn burn_refungible_item(
- collection_id: u64,
- item_id: u64,
+ collection_id: CollectionId,
+ item_id: TokenId,
owner: T::AccountId,
) -> DispatchResult {
ensure!(
@@ -1587,7 +1593,7 @@
// update balance
let new_balance = <Balance<T>>::get(collection_id, item.owner.clone())
- .checked_sub(item.fraction as u64)
+ .checked_sub(item.fraction)
.ok_or(Error::<T>::NumOverflow)?;
<Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);
@@ -1596,7 +1602,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 +1623,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
@@ -1630,7 +1636,7 @@
// update balance
let new_balance = <Balance<T>>::get(collection_id, item.owner.clone())
- .checked_sub(item.value as u64)
+ .checked_sub(item.value)
.ok_or(Error::<T>::NumOverflow)?;
<Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);
@@ -1639,7 +1645,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 +1653,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 +1665,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 +1680,7 @@
}
fn check_owner_or_admin_permissions(
- collection_id: u64,
+ collection_id: CollectionId,
subject: T::AccountId,
) -> DispatchResult {
Self::collection_exists(collection_id)?;
@@ -1687,7 +1693,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 +1713,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,9 +1723,9 @@
}
fn transfer_fungible(
- collection_id: u64,
- item_id: u64,
- value: u64,
+ collection_id: CollectionId,
+ item_id: TokenId,
+ value: u128,
owner: T::AccountId,
new_owner: T::AccountId,
) -> DispatchResult {
@@ -1731,7 +1737,7 @@
let full_item = <FungibleItemList<T>>::get(collection_id, item_id);
let amount = full_item.value;
- ensure!(amount >= value.into(), Error::<T>::TokenValueTooLow);
+ ensure!(amount >= value, Error::<T>::TokenValueTooLow);
// update balance
let balance_old_owner = <Balance<T>>::get(collection_id, owner.clone())
@@ -1745,10 +1751,8 @@
new_owner_account_id = new_owner_items[0];
}
- let val64 = value.into();
-
// transfer
- if amount == val64 && new_owner_account_id == 0 {
+ if amount == value && new_owner_account_id == 0 {
// change owner
// new owner do not have account
let mut new_full_item = full_item.clone();
@@ -1765,13 +1769,13 @@
Self::move_token_index(collection_id, item_id, owner.clone(), new_owner.clone())?;
} else {
let mut new_full_item = full_item.clone();
- new_full_item.value -= val64;
+ new_full_item.value -= value;
// separate amount
if new_owner_account_id > 0 {
// new owner has account
let mut item = <FungibleItemList<T>>::get(collection_id, new_owner_account_id);
- item.value += val64;
+ item.value += value;
// update balance
let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.clone())
@@ -1785,13 +1789,13 @@
let item = FungibleItemType {
collection: collection_id,
owner: new_owner.clone(),
- value: val64,
+ value
};
Self::add_fungible_item(item)?;
}
- if amount == val64 {
+ if amount == value {
Self::remove_token_index(collection_id, item_id, full_item.owner.clone())?;
// remove approve list
@@ -1806,9 +1810,9 @@
}
fn transfer_refungible(
- collection_id: u64,
- item_id: u64,
- value: u64,
+ collection_id: CollectionId,
+ item_id: TokenId,
+ value: u128,
owner: T::AccountId,
new_owner: T::AccountId,
) -> DispatchResult {
@@ -1826,7 +1830,7 @@
.ok_or(Error::<T>::NumOverflow)?;
let amount = item.fraction;
- ensure!(amount >= value.into(), Error::<T>::TokenValueTooLow);
+ ensure!(amount >= value, Error::<T>::TokenValueTooLow);
// update balance
let balance_old_owner = <Balance<T>>::get(collection_id, item.owner.clone())
@@ -1841,10 +1845,9 @@
let old_owner = item.owner.clone();
let new_owner_has_account = full_item.owner.iter().any(|i| i.owner == new_owner);
- let val64 = value.into();
// transfer
- if amount == val64 && !new_owner_has_account {
+ if amount == value && !new_owner_has_account {
// change owner
// new owner do not have account
let mut new_full_item = full_item.clone();
@@ -1865,7 +1868,7 @@
.iter_mut()
.find(|i| i.owner == owner)
.unwrap()
- .fraction -= val64;
+ .fraction -= value;
// separate amount
if new_owner_has_account {
@@ -1875,12 +1878,12 @@
.iter_mut()
.find(|i| i.owner == new_owner)
.unwrap()
- .fraction += val64;
+ .fraction += value;
} else {
// new owner do not have account
new_full_item.owner.push(Ownership {
owner: new_owner.clone(),
- fraction: val64,
+ fraction: value,
});
Self::add_token_index(collection_id, item_id, new_owner.clone())?;
}
@@ -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);
@@ -1979,8 +1982,8 @@
fn init_collection(item: &CollectionType<T::AccountId>) {
// check params
assert!(
- item.decimal_points <= 4,
- "decimal_points parameter must be lower than 4"
+ item.decimal_points <= MAX_DECIMAL_POINTS,
+ "decimal_points parameter must be lower than MAX_DECIMAL_POINTS"
);
assert!(
item.name.len() <= 64,
@@ -2026,7 +2029,6 @@
.checked_add(1)
.unwrap();
let owner = item.owner.clone();
- let value = item.value as u64;
Self::add_token_index(item.collection, current_index, owner.clone()).unwrap();
@@ -2034,7 +2036,7 @@
// Update balance
let new_balance = <Balance<T>>::get(item.collection, owner.clone())
- .checked_add(value)
+ .checked_add(item.value)
.unwrap();
<Balance<T>>::insert(item.collection, owner.clone(), new_balance);
}
@@ -2044,7 +2046,7 @@
.checked_add(1)
.unwrap();
- let value = item.owner.first().unwrap().fraction as u64;
+ let value = item.owner.first().unwrap().fraction;
let owner = item.owner.first().unwrap().owner.clone();
Self::add_token_index(item.collection, current_index, owner.clone()).unwrap();
@@ -2058,7 +2060,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 +2098,8 @@
}
fn remove_token_index(
- collection_id: u64,
- item_index: u64,
+ collection_id: CollectionId,
+ item_index: TokenId,
owner: T::AccountId,
) -> DispatchResult {
@@ -2123,8 +2125,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, MAX_DECIMAL_POINTS}; //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_fungible_collection_fails_with_large_decimal_numbers() {82 new_test_ext().execute_with(|| {83 default_limits();8485 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();86 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();87 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();8889 let origin1 = Origin::signed(1);90 assert_noop!(TemplateModule::create_collection(91 origin1,92 col_name1,93 col_desc1,94 token_prefix1,95 CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)96 ), Error::<Test>::CollectionDecimalPointLimitExceeded);97 }); 98}99100#[test]101fn create_re_fungible_collection_fails_with_large_decimal_numbers() {102 new_test_ext().execute_with(|| {103 default_limits();104105 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();106 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();107 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();108109 let origin1 = Origin::signed(1);110 assert_noop!(TemplateModule::create_collection(111 origin1,112 col_name1,113 col_desc1,114 token_prefix1,115 CollectionMode::ReFungible(MAX_DECIMAL_POINTS + 1)116 ), Error::<Test>::CollectionDecimalPointLimitExceeded);117 });118}119120#[test]121fn create_nft_item() {122 new_test_ext().execute_with(|| {123 default_limits();124 let collection_id = create_test_collection(&CollectionMode::NFT, 1);125 126 let data = default_nft_data();127 create_test_item(collection_id, &data.clone().into());128 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).const_data, data.const_data);129 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, data.variable_data);130 });131}132133// Use cases tests region134// #region135#[test]136fn create_nft_multiple_items() {137 new_test_ext().execute_with(|| {138 default_limits();139 140 create_test_collection(&CollectionMode::NFT, 1);141142 let origin1 = Origin::signed(1);143144 let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];145146 assert_ok!(TemplateModule::create_multiple_items(147 origin1.clone(),148 1,149 1,150 items_data.clone().into_iter().map(|d| { d.into() }).collect()151 ));152 for (index, data) in items_data.iter().enumerate() {153 assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).const_data.to_vec(), data.const_data);154 assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).variable_data.to_vec(), data.variable_data);155 }156 });157}158159#[test]160fn create_refungible_item() {161 new_test_ext().execute_with(|| {162 default_limits();163 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);164165 let data = default_re_fungible_data();166 create_test_item(collection_id, &data.clone().into());167 assert_eq!(168 TemplateModule::refungible_item_id(collection_id, 1).const_data,169 data.const_data170 );171 assert_eq!(172 TemplateModule::refungible_item_id(collection_id, 1).variable_data,173 data.variable_data174 );175 assert_eq!(176 TemplateModule::refungible_item_id(collection_id, 1).owner[0],177 Ownership {178 owner: 1,179 fraction: 1000180 }181 );182 });183}184185#[test]186fn create_multiple_refungible_items() {187 new_test_ext().execute_with(|| {188 default_limits();189 190 create_test_collection(&CollectionMode::ReFungible(3), 1);191192 let origin1 = Origin::signed(1);193194 let items_data = vec![default_re_fungible_data(), default_re_fungible_data(), default_re_fungible_data()];195196 assert_ok!(TemplateModule::create_multiple_items(197 origin1.clone(),198 1,199 1,200 items_data.clone().into_iter().map(|d| { d.into() }).collect()201 ));202 for (index, data) in items_data.iter().enumerate() {203204 let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId);205 assert_eq!(item.const_data.to_vec(), data.const_data);206 assert_eq!(item.variable_data.to_vec(), data.variable_data);207 assert_eq!(208 item.owner[0],209 Ownership {210 owner: 1,211 fraction: 1000212 }213 );214 }215 });216}217218#[test]219fn create_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 data = default_fungible_data();226 create_test_item(collection_id, &data.into());227228 assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).owner, 1);229 });230}231232#[test]233fn create_multiple_fungible_items() {234 new_test_ext().execute_with(|| {235 default_limits();236237 create_test_collection(&CollectionMode::Fungible(3), 1);238239 let origin1 = Origin::signed(1);240241 let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];242243 assert_ok!(TemplateModule::create_multiple_items(244 origin1.clone(),245 1,246 1,247 items_data.clone().into_iter().map(|d| { d.into() }).collect()248 ));249 250 for (index, _) in items_data.iter().enumerate() {251 assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).owner, 1);252 }253 assert_eq!(TemplateModule::balance_count(1, 1), 3000);254 assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);255 });256}257258#[test]259fn transfer_fungible_item() {260 new_test_ext().execute_with(|| {261 default_limits();262 263 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);264265 let origin1 = Origin::signed(1);266 let origin2 = Origin::signed(2);267268 let data = default_fungible_data();269 create_test_item(collection_id, &data.into());270271 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);272 assert_eq!(TemplateModule::balance_count(1, 1), 1000);273 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);274275 // change owner scenario276 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));277 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);278 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 1000);279 assert_eq!(TemplateModule::balance_count(1, 1), 0);280 assert_eq!(TemplateModule::balance_count(1, 2), 1000);281 // assert_eq!(TemplateModule::address_tokens(1, 1), []);282 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);283284 // split item scenario285 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));286 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);287 assert_eq!(TemplateModule::fungible_item_id(1, 2).owner, 3);288 assert_eq!(TemplateModule::balance_count(1, 2), 500);289 assert_eq!(TemplateModule::balance_count(1, 3), 500);290 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);291 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);292293 // split item and new owner has account scenario294 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));295 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 300);296 assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 700);297 assert_eq!(TemplateModule::balance_count(1, 2), 300);298 assert_eq!(TemplateModule::balance_count(1, 3), 700);299 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);300 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);301 });302}303304#[test]305fn transfer_refungible_item() {306 new_test_ext().execute_with(|| {307 default_limits();308 309 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);310311 let data = default_re_fungible_data();312 create_test_item(collection_id, &data.clone().into());313314 let origin1 = Origin::signed(1);315 let origin2 = Origin::signed(2);316 assert_eq!(317 TemplateModule::refungible_item_id(collection_id, 1).const_data,318 data.const_data319 );320 assert_eq!(321 TemplateModule::refungible_item_id(collection_id, 1).variable_data,322 data.variable_data323 );324 assert_eq!(325 TemplateModule::refungible_item_id(collection_id, 1).owner[0],326 Ownership {327 owner: 1,328 fraction: 1000329 }330 );331 assert_eq!(TemplateModule::balance_count(1, 1), 1000);332 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);333334 // change owner scenario335 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));336 assert_eq!(337 TemplateModule::refungible_item_id(1, 1).owner[0],338 Ownership {339 owner: 2,340 fraction: 1000341 }342 );343 assert_eq!(TemplateModule::balance_count(1, 1), 0);344 assert_eq!(TemplateModule::balance_count(1, 2), 1000);345 // assert_eq!(TemplateModule::address_tokens(1, 1), []);346 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);347348 // split item scenario349 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));350 assert_eq!(351 TemplateModule::refungible_item_id(1, 1).owner[0],352 Ownership {353 owner: 2,354 fraction: 500355 }356 );357 assert_eq!(358 TemplateModule::refungible_item_id(1, 1).owner[1],359 Ownership {360 owner: 3,361 fraction: 500362 }363 );364 assert_eq!(TemplateModule::balance_count(1, 2), 500);365 assert_eq!(TemplateModule::balance_count(1, 3), 500);366 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);367 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);368369 // split item and new owner has account scenario370 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));371 assert_eq!(372 TemplateModule::refungible_item_id(1, 1).owner[0],373 Ownership {374 owner: 2,375 fraction: 300376 }377 );378 assert_eq!(379 TemplateModule::refungible_item_id(1, 1).owner[1],380 Ownership {381 owner: 3,382 fraction: 700383 }384 );385 assert_eq!(TemplateModule::balance_count(1, 2), 300);386 assert_eq!(TemplateModule::balance_count(1, 3), 700);387 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);388 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);389 });390}391392#[test]393fn transfer_nft_item() {394 new_test_ext().execute_with(|| {395 default_limits();396 397 let collection_id = create_test_collection(&CollectionMode::NFT, 1);398399 let data = default_nft_data();400 create_test_item(collection_id, &data.into());401 assert_eq!(TemplateModule::balance_count(1, 1), 1);402 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);403404 let origin1 = Origin::signed(1);405 // default scenario406 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));407 assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);408 assert_eq!(TemplateModule::balance_count(1, 1), 0);409 assert_eq!(TemplateModule::balance_count(1, 2), 1);410 // assert_eq!(TemplateModule::address_tokens(1, 1), []);411 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);412 });413}414415#[test]416fn nft_approve_and_transfer_from() {417 new_test_ext().execute_with(|| {418 default_limits();419 420 let collection_id = create_test_collection(&CollectionMode::NFT, 1);421422 let data = default_nft_data();423 create_test_item(collection_id, &data.into());424425 let origin1 = Origin::signed(1);426 let origin2 = Origin::signed(2);427428 assert_eq!(TemplateModule::balance_count(1, 1), 1);429 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);430431 // neg transfer432 assert_noop!(TemplateModule::transfer_from(433 origin2.clone(),434 1,435 2,436 1,437 1,438 1), Error::<Test>::NoPermission);439440 // do approve441 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));442 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);443 assert_eq!(444 TemplateModule::approved(1, (1, 1))[0],445 ApprovePermissions {446 approved: 2,447 amount: 100000000448 }449 );450451 assert_ok!(TemplateModule::transfer_from(452 origin2.clone(),453 1,454 2,455 1,456 1,457 1458 ));459 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);460 });461}462463#[test]464fn nft_approve_and_transfer_from_white_list() {465 new_test_ext().execute_with(|| {466 default_limits();467 468 let collection_id = create_test_collection(&CollectionMode::NFT, 1);469470 let origin1 = Origin::signed(1);471 let origin2 = Origin::signed(2);472473 let data = default_nft_data();474 create_test_item(collection_id, &data.clone().into());475476 assert_eq!(TemplateModule::nft_item_id(1, 1).const_data, data.const_data);477 assert_eq!(TemplateModule::balance_count(1, 1), 1);478 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);479480 assert_ok!(TemplateModule::set_mint_permission(481 origin1.clone(),482 1,483 true484 ));485 assert_ok!(TemplateModule::set_public_access_mode(486 origin1.clone(),487 1,488 AccessMode::WhiteList489 ));490 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));491 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));492 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));493494 // do approve495 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));496 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);497 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));498 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);499 assert_eq!(500 TemplateModule::approved(1, (1, 1))[0],501 ApprovePermissions {502 approved: 2,503 amount: 100000000504 }505 );506507 assert_ok!(TemplateModule::transfer_from(508 origin2.clone(),509 1,510 3,511 1,512 1,513 1514 ));515 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);516 });517}518519#[test]520fn refungible_approve_and_transfer_from() {521 new_test_ext().execute_with(|| {522 default_limits();523 524 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);525 526 let origin1 = Origin::signed(1);527 let origin2 = Origin::signed(2);528529 let data = default_re_fungible_data();530 create_test_item(collection_id, &data.into());531532 assert_eq!(TemplateModule::balance_count(1, 1), 1000);533 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);534535 assert_ok!(TemplateModule::set_mint_permission(536 origin1.clone(),537 1,538 true539 ));540 assert_ok!(TemplateModule::set_public_access_mode(541 origin1.clone(),542 1,543 AccessMode::WhiteList544 ));545 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));546 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));547 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));548549 // do approve550 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));551 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);552 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));553 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);554 assert_eq!(555 TemplateModule::approved(1, (1, 1))[0],556 ApprovePermissions {557 approved: 2,558 amount: 100000000559 }560 );561562 assert_ok!(TemplateModule::transfer_from(563 origin2.clone(),564 1,565 3,566 1,567 1,568 100569 ));570 assert_eq!(TemplateModule::balance_count(1, 1), 900);571 assert_eq!(TemplateModule::balance_count(1, 3), 100);572 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);573 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);574575 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);576 assert_eq!(577 TemplateModule::approved(1, (1, 1))[0],578 ApprovePermissions {579 approved: 3,580 amount: 100000000581 }582 );583 });584}585586#[test]587fn fungible_approve_and_transfer_from() {588 new_test_ext().execute_with(|| {589 default_limits();590 591 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);592 593 let data = default_fungible_data();594 create_test_item(collection_id, &data.into());595596 let origin1 = Origin::signed(1);597 let origin2 = Origin::signed(2);598599 assert_eq!(TemplateModule::balance_count(1, 1), 1000);600 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);601602 assert_ok!(TemplateModule::set_mint_permission(603 origin1.clone(),604 1,605 true606 ));607 assert_ok!(TemplateModule::set_public_access_mode(608 origin1.clone(),609 1,610 AccessMode::WhiteList611 ));612 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));613 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));614 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));615616 // do approve617 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));618 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);619 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));620 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);621 assert_eq!(622 TemplateModule::approved(1, (1, 1))[0],623 ApprovePermissions {624 approved: 2,625 amount: 100000000626 }627 );628629 assert_ok!(TemplateModule::transfer_from(630 origin2.clone(),631 1,632 3,633 1,634 1,635 100636 ));637 assert_eq!(TemplateModule::balance_count(1, 1), 900);638 assert_eq!(TemplateModule::balance_count(1, 3), 100);639 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);640 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);641642 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);643 assert_eq!(644 TemplateModule::approved(1, (1, 1))[0],645 ApprovePermissions {646 approved: 3,647 amount: 100000000648 }649 );650651 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));652 assert_ok!(TemplateModule::transfer_from(653 origin2.clone(),654 1,655 3,656 1,657 1,658 900659 ));660 assert_eq!(TemplateModule::balance_count(1, 1), 0);661 assert_eq!(TemplateModule::balance_count(1, 3), 1000);662 // assert_eq!(TemplateModule::address_tokens(1, 1), []);663 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);664665 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);666 });667}668669#[test]670fn change_collection_owner() {671 new_test_ext().execute_with(|| {672 default_limits();673 674 let collection_id = create_test_collection(&CollectionMode::NFT, 1);675 676 let origin1 = Origin::signed(1);677 assert_ok!(TemplateModule::change_collection_owner(678 origin1.clone(),679 collection_id,680 2681 ));682 assert_eq!(TemplateModule::collection(collection_id).owner, 2);683 });684}685686#[test]687fn destroy_collection() {688 new_test_ext().execute_with(|| {689 default_limits();690 691 let collection_id = create_test_collection(&CollectionMode::NFT, 1);692 693 let origin1 = Origin::signed(1);694 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));695 });696}697698#[test]699fn burn_nft_item() {700 new_test_ext().execute_with(|| {701 default_limits();702 703 let collection_id = create_test_collection(&CollectionMode::NFT, 1);704705 let origin1 = Origin::signed(1);706 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));707 708 let data = default_nft_data();709 create_test_item(collection_id, &data.into());710711 // check balance (collection with id = 1, user id = 1)712 assert_eq!(TemplateModule::balance_count(1, 1), 1);713714 // burn item715 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));716 assert_noop!(717 TemplateModule::burn_item(origin1.clone(), 1, 1),718 Error::<Test>::TokenNotFound719 );720721 assert_eq!(TemplateModule::balance_count(1, 1), 0);722 });723}724725#[test]726fn burn_fungible_item() {727 new_test_ext().execute_with(|| {728 default_limits();729 730 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);731 732 let origin1 = Origin::signed(1);733 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));734 735 let data = default_fungible_data();736 create_test_item(collection_id, &data.into());737738 // check balance (collection with id = 1, user id = 1)739 assert_eq!(TemplateModule::balance_count(1, 1), 1000);740741 // burn item742 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));743 assert_noop!(744 TemplateModule::burn_item(origin1.clone(), 1, 1),745 Error::<Test>::TokenNotFound746 );747748 assert_eq!(TemplateModule::balance_count(1, 1), 0);749 });750}751752#[test]753fn burn_refungible_item() {754 new_test_ext().execute_with(|| {755 default_limits();756 757 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);758 let origin1 = Origin::signed(1);759760 assert_ok!(TemplateModule::set_mint_permission(761 origin1.clone(),762 collection_id,763 true764 ));765 assert_ok!(TemplateModule::set_public_access_mode(766 origin1.clone(),767 collection_id,768 AccessMode::WhiteList769 ));770 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));771772 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));773 774 let data = default_re_fungible_data();775 create_test_item(collection_id, &data.into());776777 // check balance (collection with id = 1, user id = 2)778 assert_eq!(TemplateModule::balance_count(1, 1), 1000);779780 // burn item781 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));782 assert_noop!(783 TemplateModule::burn_item(origin1.clone(), 1, 1),784 Error::<Test>::TokenNotFound785 );786787 assert_eq!(TemplateModule::balance_count(1, 1), 0);788 });789}790791#[test]792fn add_collection_admin() {793 new_test_ext().execute_with(|| {794 default_limits();795 796 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);797 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);798 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);799 800 let origin1 = Origin::signed(1);801802 // collection admin803 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));804 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));805806 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&2), true);807 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&3), true);808 });809}810811#[test]812fn remove_collection_admin() {813 new_test_ext().execute_with(|| {814 default_limits();815 816 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);817 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);818 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);819820 let origin1 = Origin::signed(1);821 let origin2 = Origin::signed(2);822823 // collection admin824 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));825 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));826827 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);828 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);829830 // remove admin831 assert_ok!(TemplateModule::remove_collection_admin(832 origin2.clone(),833 1,834 3835 ));836 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);837 });838}839840#[test]841fn balance_of() {842 new_test_ext().execute_with(|| {843 default_limits();844 845 let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);846 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);847 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3), 3);848 849 // check balance before850 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);851 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);852 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 0);853854 let nft_data = default_nft_data();855 create_test_item(nft_collection_id, &nft_data.into());856 857 let fungible_data = default_fungible_data();858 create_test_item(fungible_collection_id, &fungible_data.into());859 860 let re_fungible_data = default_re_fungible_data();861 create_test_item(re_fungible_collection_id, &re_fungible_data.into());862863 // check balance (collection with id = 1, user id = 1)864 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);865 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 1000);866 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1000);867 assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1);868 assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).owner, 1);869 assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1);870 });871}872873#[test]874fn approve() {875 new_test_ext().execute_with(|| {876 default_limits();877 878 let collection_id = create_test_collection(&CollectionMode::NFT, 1);879 880 let data = default_nft_data();881 create_test_item(collection_id, &data.into());882883 let origin1 = Origin::signed(1);884 885 // approve886 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));887 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);888 });889}890891#[test]892fn transfer_from() {893 new_test_ext().execute_with(|| {894 default_limits();895 896 let collection_id = create_test_collection(&CollectionMode::NFT, 1);897 let origin1 = Origin::signed(1);898 let origin2 = Origin::signed(2);899900 let data = default_nft_data();901 create_test_item(collection_id, &data.into());902903 // approve904 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));905 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);906907 assert_ok!(TemplateModule::set_mint_permission(908 origin1.clone(),909 1,910 true911 ));912 assert_ok!(TemplateModule::set_public_access_mode(913 origin1.clone(),914 1,915 AccessMode::WhiteList916 ));917 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));918 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));919 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));920921 assert_ok!(TemplateModule::transfer_from(922 origin2.clone(),923 1,924 2,925 1,926 1,927 1928 ));929930 // after transfer931 assert_eq!(TemplateModule::balance_count(1, 1), 0);932 assert_eq!(TemplateModule::balance_count(1, 2), 1);933 });934}935936// #endregion937938// Coverage tests region939// #region940941#[test]942fn owner_can_add_address_to_white_list() {943 new_test_ext().execute_with(|| {944 default_limits();945 946 let collection_id = create_test_collection(&CollectionMode::NFT, 1);947948 let origin1 = Origin::signed(1);949 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));950 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);951 });952}953954#[test]955fn admin_can_add_address_to_white_list() {956 new_test_ext().execute_with(|| {957 default_limits();958 959 let collection_id = create_test_collection(&CollectionMode::NFT, 1);960 let origin1 = Origin::signed(1);961 let origin2 = Origin::signed(2);962963 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));964 assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3));965 assert_eq!(TemplateModule::white_list(collection_id)[0], 3);966 });967}968969#[test]970fn nonprivileged_user_cannot_add_address_to_white_list() {971 new_test_ext().execute_with(|| {972 default_limits();973 974 let collection_id = create_test_collection(&CollectionMode::NFT, 1);975976 let origin2 = Origin::signed(2);977 assert_noop!(978 TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3),979 Error::<Test>::NoPermission980 );981 });982}983984#[test]985fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {986 new_test_ext().execute_with(|| {987 default_limits();988989 let origin1 = Origin::signed(1);990991 assert_noop!(992 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),993 Error::<Test>::CollectionNotFound994 );995 });996}997998#[test]999fn nobody_can_add_address_to_white_list_of_deleted_collection() {1000 new_test_ext().execute_with(|| {1001 default_limits();1002 1003 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10041005 let origin1 = Origin::signed(1);1006 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1007 assert_noop!(1008 TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2),1009 Error::<Test>::CollectionNotFound1010 );1011 });1012}10131014// If address is already added to white list, nothing happens1015#[test]1016fn address_is_already_added_to_white_list() {1017 new_test_ext().execute_with(|| {1018 default_limits();1019 1020 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1021 let origin1 = Origin::signed(1);1022 1023 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1024 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1025 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1026 assert_eq!(TemplateModule::white_list(collection_id).len(), 1);1027 });1028}10291030#[test]1031fn owner_can_remove_address_from_white_list() {1032 new_test_ext().execute_with(|| {1033 default_limits();1034 1035 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10361037 let origin1 = Origin::signed(1);1038 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1039 assert_ok!(TemplateModule::remove_from_white_list(1040 origin1.clone(),1041 collection_id,1042 21043 ));1044 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1045 });1046}10471048#[test]1049fn admin_can_remove_address_from_white_list() {1050 new_test_ext().execute_with(|| {1051 default_limits();1052 1053 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1054 let origin1 = Origin::signed(1);1055 let origin2 = Origin::signed(2);10561057 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));10581059 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 3));1060 assert_ok!(TemplateModule::remove_from_white_list(1061 origin2.clone(),1062 collection_id,1063 31064 ));1065 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1066 });1067}10681069#[test]1070fn nonprivileged_user_cannot_remove_address_from_white_list() {1071 new_test_ext().execute_with(|| {1072 default_limits();1073 1074 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1075 let origin1 = Origin::signed(1);1076 let origin2 = Origin::signed(2);10771078 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1079 assert_noop!(1080 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1081 Error::<Test>::NoPermission1082 );1083 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1084 });1085}10861087#[test]1088fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1089 new_test_ext().execute_with(|| {1090 default_limits();1091 let origin1 = Origin::signed(1);10921093 assert_noop!(1094 TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),1095 Error::<Test>::CollectionNotFound1096 );1097 });1098}10991100#[test]1101fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1102 new_test_ext().execute_with(|| {1103 default_limits();1104 1105 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1106 let origin1 = Origin::signed(1);1107 let origin2 = Origin::signed(2);11081109 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1110 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1111 assert_noop!(1112 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1113 Error::<Test>::CollectionNotFound1114 );1115 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1116 });1117}11181119// If address is already removed from white list, nothing happens1120#[test]1121fn address_is_already_removed_from_white_list() {1122 new_test_ext().execute_with(|| {1123 default_limits();1124 1125 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1126 let origin1 = Origin::signed(1);11271128 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1129 assert_ok!(TemplateModule::remove_from_white_list(1130 origin1.clone(),1131 collection_id,1132 21133 ));1134 assert_ok!(TemplateModule::remove_from_white_list(1135 origin1.clone(),1136 collection_id,1137 21138 ));1139 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1140 });1141}11421143// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1144#[test]1145fn white_list_test_1() {1146 new_test_ext().execute_with(|| {1147 default_limits();1148 1149 let collection_id = create_test_collection(&CollectionMode::NFT, 1);11501151 let origin1 = Origin::signed(1);1152 1153 let data = default_nft_data();1154 create_test_item(collection_id, &data.into());11551156 assert_ok!(TemplateModule::set_public_access_mode(1157 origin1.clone(),1158 collection_id,1159 AccessMode::WhiteList1160 ));1161 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));11621163 assert_noop!(1164 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1165 Error::<Test>::AddresNotInWhiteList1166 );1167 });1168}11691170#[test]1171fn white_list_test_2() {1172 new_test_ext().execute_with(|| {1173 default_limits();1174 1175 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1176 let origin1 = Origin::signed(1);1177 1178 let data = default_nft_data();1179 create_test_item(collection_id, &data.into());11801181 assert_ok!(TemplateModule::set_public_access_mode(1182 origin1.clone(),1183 collection_id,1184 AccessMode::WhiteList1185 ));1186 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1187 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));11881189 // do approve1190 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1191 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);11921193 assert_ok!(TemplateModule::remove_from_white_list(1194 origin1.clone(),1195 1,1196 11197 ));11981199 assert_noop!(1200 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1201 Error::<Test>::AddresNotInWhiteList1202 );1203 });1204}12051206// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1207#[test]1208fn white_list_test_3() {1209 new_test_ext().execute_with(|| {1210 default_limits();1211 1212 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12131214 let origin1 = Origin::signed(1);1215 1216 let data = default_nft_data();1217 create_test_item(collection_id, &data.into());12181219 assert_ok!(TemplateModule::set_public_access_mode(1220 origin1.clone(),1221 collection_id,1222 AccessMode::WhiteList1223 ));1224 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));12251226 assert_noop!(1227 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1228 Error::<Test>::AddresNotInWhiteList1229 );1230 });1231}12321233#[test]1234fn white_list_test_4() {1235 new_test_ext().execute_with(|| {1236 default_limits();1237 1238 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12391240 let origin1 = Origin::signed(1);12411242 let data = default_nft_data();1243 create_test_item(collection_id, &data.into());12441245 assert_ok!(TemplateModule::set_public_access_mode(1246 origin1.clone(),1247 collection_id,1248 AccessMode::WhiteList1249 ));1250 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1251 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));12521253 // do approve1254 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1255 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);12561257 assert_ok!(TemplateModule::remove_from_white_list(1258 origin1.clone(),1259 collection_id,1260 21261 ));12621263 assert_noop!(1264 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1265 Error::<Test>::AddresNotInWhiteList1266 );1267 });1268}12691270// 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)1271#[test]1272fn white_list_test_5() {1273 new_test_ext().execute_with(|| {1274 default_limits();1275 1276 let collection_id = create_test_collection(&CollectionMode::NFT, 1);12771278 let origin1 = Origin::signed(1);12791280 let data = default_nft_data();1281 create_test_item(collection_id, &data.into());12821283 assert_ok!(TemplateModule::set_public_access_mode(1284 origin1.clone(),1285 collection_id,1286 AccessMode::WhiteList1287 ));1288 assert_noop!(1289 TemplateModule::burn_item(origin1.clone(), 1, 1),1290 Error::<Test>::AddresNotInWhiteList1291 );1292 });1293}12941295// If Public Access mode is set to WhiteList, oken transfers can’t be Approved by a non-whitelisted address (see Approve method).1296#[test]1297fn white_list_test_6() {1298 new_test_ext().execute_with(|| {1299 default_limits();1300 1301 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13021303 let origin1 = Origin::signed(1);1304 assert_ok!(TemplateModule::set_public_access_mode(1305 origin1.clone(),1306 collection_id,1307 AccessMode::WhiteList1308 ));13091310 // do approve1311 assert_noop!(1312 TemplateModule::approve(origin1.clone(), 1, 1, 1),1313 Error::<Test>::AddresNotInWhiteList1314 );1315 });1316}13171318// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1319// tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1320#[test]1321fn white_list_test_7() {1322 new_test_ext().execute_with(|| {1323 default_limits();1324 1325 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13261327 let data = default_nft_data();1328 create_test_item(collection_id, &data.into());1329 1330 let origin1 = Origin::signed(1);13311332 assert_ok!(TemplateModule::set_public_access_mode(1333 origin1.clone(),1334 collection_id,1335 AccessMode::WhiteList1336 ));1337 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1338 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13391340 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1341 });1342}13431344#[test]1345fn white_list_test_8() {1346 new_test_ext().execute_with(|| {1347 default_limits();1348 1349 let collection_id = create_test_collection(&CollectionMode::NFT, 1);13501351 let data = default_nft_data();1352 create_test_item(collection_id, &data.into());1353 1354 let origin1 = Origin::signed(1);13551356 assert_ok!(TemplateModule::set_public_access_mode(1357 origin1.clone(),1358 collection_id,1359 AccessMode::WhiteList1360 ));1361 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1362 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13631364 // do approve1365 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1366 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);13671368 assert_ok!(TemplateModule::transfer_from(1369 origin1.clone(),1370 1,1371 2,1372 1,1373 1,1374 11375 ));1376 });1377}13781379// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1380#[test]1381fn white_list_test_9() {1382 new_test_ext().execute_with(|| {1383 default_limits();1384 1385 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1386 let origin1 = Origin::signed(1);13871388 assert_ok!(TemplateModule::set_public_access_mode(1389 origin1.clone(),1390 collection_id,1391 AccessMode::WhiteList1392 ));1393 assert_ok!(TemplateModule::set_mint_permission(1394 origin1.clone(),1395 collection_id,1396 false1397 ));13981399 let data = default_nft_data();1400 create_test_item(collection_id, &data.into());1401 });1402}14031404// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1405#[test]1406fn white_list_test_10() {1407 new_test_ext().execute_with(|| {1408 default_limits();1409 1410 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14111412 let origin1 = Origin::signed(1);1413 let origin2 = Origin::signed(2);14141415 assert_ok!(TemplateModule::set_public_access_mode(1416 origin1.clone(),1417 collection_id,1418 AccessMode::WhiteList1419 ));1420 assert_ok!(TemplateModule::set_mint_permission(1421 origin1.clone(),1422 collection_id,1423 false1424 ));14251426 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));14271428 assert_ok!(TemplateModule::create_item(1429 origin2.clone(),1430 collection_id,1431 2,1432 default_nft_data().into()1433 ));1434 });1435}14361437// 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.1438#[test]1439fn white_list_test_11() {1440 new_test_ext().execute_with(|| {1441 default_limits();1442 1443 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14441445 let origin1 = Origin::signed(1);1446 let origin2 = Origin::signed(2);14471448 assert_ok!(TemplateModule::set_public_access_mode(1449 origin1.clone(),1450 collection_id,1451 AccessMode::WhiteList1452 ));1453 assert_ok!(TemplateModule::set_mint_permission(1454 origin1.clone(),1455 collection_id,1456 false1457 ));1458 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));14591460 assert_noop!(1461 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1462 Error::<Test>::PublicMintingNotAllowed1463 );1464 });1465}14661467// 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.1468#[test]1469fn white_list_test_12() {1470 new_test_ext().execute_with(|| {1471 default_limits();1472 1473 let collection_id = create_test_collection(&CollectionMode::NFT, 1);14741475 let origin1 = Origin::signed(1);1476 let origin2 = Origin::signed(2);14771478 assert_ok!(TemplateModule::set_public_access_mode(1479 origin1.clone(),1480 collection_id,1481 AccessMode::WhiteList1482 ));1483 assert_ok!(TemplateModule::set_mint_permission(1484 origin1.clone(),1485 collection_id,1486 false1487 ));14881489 assert_noop!(1490 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1491 Error::<Test>::PublicMintingNotAllowed1492 );1493 });1494}14951496// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1497#[test]1498fn white_list_test_13() {1499 new_test_ext().execute_with(|| {1500 default_limits();1501 1502 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15031504 let origin1 = Origin::signed(1);15051506 assert_ok!(TemplateModule::set_public_access_mode(1507 origin1.clone(),1508 collection_id,1509 AccessMode::WhiteList1510 ));1511 assert_ok!(TemplateModule::set_mint_permission(1512 origin1.clone(),1513 collection_id,1514 true1515 ));15161517 let data = default_nft_data();1518 create_test_item(collection_id, &data.into());1519 });1520}15211522// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1523#[test]1524fn white_list_test_14() {1525 new_test_ext().execute_with(|| {1526 default_limits();1527 1528 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15291530 let origin1 = Origin::signed(1);1531 let origin2 = Origin::signed(2);15321533 assert_ok!(TemplateModule::set_public_access_mode(1534 origin1.clone(),1535 collection_id,1536 AccessMode::WhiteList1537 ));1538 assert_ok!(TemplateModule::set_mint_permission(1539 origin1.clone(),1540 collection_id,1541 true1542 ));15431544 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));15451546 assert_ok!(TemplateModule::create_item(1547 origin2.clone(),1548 1,1549 2,1550 default_nft_data().into()1551 ));1552 });1553}15541555// 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.1556#[test]1557fn white_list_test_15() {1558 new_test_ext().execute_with(|| {1559 default_limits();1560 1561 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15621563 let origin1 = Origin::signed(1);1564 let origin2 = Origin::signed(2);15651566 assert_ok!(TemplateModule::set_public_access_mode(1567 origin1.clone(),1568 collection_id,1569 AccessMode::WhiteList1570 ));1571 assert_ok!(TemplateModule::set_mint_permission(1572 origin1.clone(),1573 collection_id,1574 true1575 ));15761577 assert_noop!(1578 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1579 Error::<Test>::AddresNotInWhiteList1580 );1581 });1582}15831584// 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.1585#[test]1586fn white_list_test_16() {1587 new_test_ext().execute_with(|| {1588 default_limits();1589 1590 let collection_id = create_test_collection(&CollectionMode::NFT, 1);15911592 let origin1 = Origin::signed(1);1593 let origin2 = Origin::signed(2);15941595 assert_ok!(TemplateModule::set_public_access_mode(1596 origin1.clone(),1597 collection_id,1598 AccessMode::WhiteList1599 ));1600 assert_ok!(TemplateModule::set_mint_permission(1601 origin1.clone(),1602 collection_id,1603 true1604 ));1605 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));16061607 assert_ok!(TemplateModule::create_item(1608 origin2.clone(),1609 1,1610 2,1611 default_nft_data().into()1612 ));1613 });1614}16151616// Total number of collections. Positive test1617#[test]1618fn total_number_collections_bound() {1619 new_test_ext().execute_with(|| {1620 default_limits();1621 1622 create_test_collection(&CollectionMode::NFT, 1);1623 });1624}16251626// Total number of collections. Negotive test1627#[test]1628fn total_number_collections_bound_neg() {1629 new_test_ext().execute_with(|| {1630 default_limits();16311632 let origin1 = Origin::signed(1);16331634 for i in 0..default_collection_numbers_limit() {1635 create_test_collection(&CollectionMode::NFT, i + 1);1636 }16371638 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1639 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1640 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();16411642 // 11-th collection in chain. Expects error1643 assert_noop!(TemplateModule::create_collection(1644 origin1.clone(),1645 col_name1.clone(),1646 col_desc1.clone(),1647 token_prefix1.clone(),1648 CollectionMode::NFT1649 ), Error::<Test>::TotalCollectionsLimitExceeded);1650 });1651}16521653// Owned tokens by a single address. Positive test1654#[test]1655fn owned_tokens_bound() {1656 new_test_ext().execute_with(|| {1657 default_limits();1658 1659 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16601661 let data = default_nft_data();1662 create_test_item(collection_id, &data.clone().into());1663 create_test_item(collection_id, &data.into());1664 });1665}16661667// Owned tokens by a single address. Negotive test1668#[test]1669fn owned_tokens_bound_neg() {1670 new_test_ext().execute_with(|| {1671 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1672 collection_numbers_limit: 10,1673 account_token_ownership_limit: 1,1674 collections_admins_limit: 5,1675 custom_data_limit: 2048,1676 nft_sponsor_transfer_timeout: 15,1677 fungible_sponsor_transfer_timeout: 15,1678 refungible_sponsor_transfer_timeout: 15, 1679 }));1680 1681 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16821683 let origin1 = Origin::signed(1);1684 let data = default_nft_data();1685 create_test_item(collection_id, &data.clone().into());16861687 assert_noop!(TemplateModule::create_item(1688 origin1.clone(),1689 1,1690 1,1691 data.into()1692 ), Error::<Test>::AddressOwnershipLimitExceeded);1693 });1694}16951696// Number of collection admins. Positive test1697#[test]1698fn collection_admins_bound() {1699 new_test_ext().execute_with(|| {1700 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1701 collection_numbers_limit: 10,1702 account_token_ownership_limit: 10,1703 collections_admins_limit: 2,1704 custom_data_limit: 2048,1705 nft_sponsor_transfer_timeout: 15,1706 fungible_sponsor_transfer_timeout: 15,1707 refungible_sponsor_transfer_timeout: 15, 1708 }));1709 1710 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17111712 let origin1 = Origin::signed(1);1713 1714 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1715 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3));1716 });1717}17181719// Number of collection admins. Negotive test1720#[test]1721fn collection_admins_bound_neg() {1722 new_test_ext().execute_with(|| {1723 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1724 collection_numbers_limit: 10,1725 account_token_ownership_limit: 1,1726 collections_admins_limit: 1,1727 custom_data_limit: 2048,1728 nft_sponsor_transfer_timeout: 15,1729 fungible_sponsor_transfer_timeout: 15,1730 refungible_sponsor_transfer_timeout: 15, 1731 }));1732 1733 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17341735 let origin1 = Origin::signed(1);17361737 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1738 assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3), Error::<Test>::CollectionAdminsLimitExceeded);1739 });1740}17411742// NFT custom data size. Negative test const_data.1743#[test]1744fn custom_data_size_nft_const_data_bound_neg() {1745 new_test_ext().execute_with(|| {1746 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1747 collection_numbers_limit: 10,1748 account_token_ownership_limit: 10,1749 collections_admins_limit: 5,1750 custom_data_limit: 2,1751 nft_sponsor_transfer_timeout: 15,1752 fungible_sponsor_transfer_timeout: 15,1753 refungible_sponsor_transfer_timeout: 15, 1754 }));1755 1756 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17571758 let origin1 = Origin::signed(1);1759 let too_big_const_data = CreateItemData::NFT(CreateNftData{1760 const_data: vec![1, 2, 3, 4],1761 variable_data: vec![]1762 });17631764 assert_noop!(TemplateModule::create_item(1765 origin1.clone(),1766 collection_id,1767 1,1768 too_big_const_data1769 ), Error::<Test>::TokenConstDataLimitExceeded);1770 });1771}17721773// NFT custom data size. Negative test variable_data.1774#[test]1775fn custom_data_size_nft_variable_data_bound_neg() {1776 new_test_ext().execute_with(|| {1777 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1778 collection_numbers_limit: 10,1779 account_token_ownership_limit: 10,1780 collections_admins_limit: 5,1781 custom_data_limit: 2,1782 nft_sponsor_transfer_timeout: 15,1783 fungible_sponsor_transfer_timeout: 15,1784 refungible_sponsor_transfer_timeout: 15, 1785 }));17861787 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17881789 let origin1 = Origin::signed(1);1790 let too_big_const_data = CreateItemData::NFT(CreateNftData{1791 const_data: vec![],1792 variable_data: vec![1, 2, 3, 4]1793 });17941795 assert_noop!(TemplateModule::create_item(1796 origin1.clone(),1797 collection_id,1798 1,1799 too_big_const_data1800 ), Error::<Test>::TokenVariableDataLimitExceeded);1801 });1802}18031804// Re fungible custom data size. Negative test const_data.1805#[test]1806fn custom_data_size_re_fungible_const_data_bound_neg() {1807 new_test_ext().execute_with(|| {1808 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1809 collection_numbers_limit: 10,1810 account_token_ownership_limit: 10,1811 collections_admins_limit: 5,1812 custom_data_limit: 2,1813 nft_sponsor_transfer_timeout: 15,1814 fungible_sponsor_transfer_timeout: 15,1815 refungible_sponsor_transfer_timeout: 15, 1816 }));18171818 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18191820 let origin1 = Origin::signed(1);1821 let too_big_const_data = CreateItemData::NFT(CreateNftData{1822 const_data: vec![1, 2, 3, 4],1823 variable_data: vec![]1824 });18251826 assert_noop!(TemplateModule::create_item(1827 origin1.clone(),1828 collection_id,1829 1,1830 too_big_const_data1831 ), Error::<Test>::TokenConstDataLimitExceeded);1832 });1833}18341835// Re fungible custom data size. Negative test variable_data.1836#[test]1837fn custom_data_size_re_fungible_variable_data_bound_neg() {1838 new_test_ext().execute_with(|| {1839 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1840 collection_numbers_limit: 10,1841 account_token_ownership_limit: 10,1842 collections_admins_limit: 5,1843 custom_data_limit: 2,1844 nft_sponsor_transfer_timeout: 15,1845 fungible_sponsor_transfer_timeout: 15,1846 refungible_sponsor_transfer_timeout: 15, 1847 }));18481849 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18501851 let origin1 = Origin::signed(1);1852 let too_big_const_data = CreateItemData::NFT(CreateNftData{1853 const_data: vec![],1854 variable_data: vec![1, 2, 3, 4]1855 });18561857 assert_noop!(TemplateModule::create_item(1858 origin1.clone(),1859 collection_id,1860 1,1861 too_big_const_data1862 ), Error::<Test>::TokenVariableDataLimitExceeded);1863 });1864}1865// #endregion18661867#[test]1868fn set_const_on_chain_schema() {1869 new_test_ext().execute_with(|| {1870 default_limits();18711872 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18731874 let origin1 = Origin::signed(1);1875 assert_ok!(TemplateModule::set_const_on_chain_schema(origin1, collection_id, b"test const on chain schema".to_vec()));18761877 assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"test const on chain schema".to_vec());1878 assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"".to_vec());1879 });1880}18811882#[test]1883fn set_variable_on_chain_schema() {1884 new_test_ext().execute_with(|| {1885 default_limits();1886 1887 let collection_id = create_test_collection(&CollectionMode::NFT, 1);18881889 let origin1 = Origin::signed(1);1890 assert_ok!(TemplateModule::set_variable_on_chain_schema(origin1, collection_id, b"test variable on chain schema".to_vec()));18911892 assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"".to_vec());1893 assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"test variable on chain schema".to_vec());1894 });1895}18961897#[test]1898fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1899 new_test_ext().execute_with(|| {1900 default_limits();19011902 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19031904 let origin1 = Origin::signed(1);1905 1906 let data = default_nft_data();1907 create_test_item(1, &data.into());1908 1909 let variable_data = b"test set_variable_meta_data method.".to_vec();1910 assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));19111912 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, variable_data);1913 });1914}19151916#[test]1917fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1918 new_test_ext().execute_with(|| {1919 default_limits();19201921 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);19221923 let origin1 = Origin::signed(1);19241925 let data = default_re_fungible_data();1926 create_test_item(1, &data.into());19271928 let variable_data = b"test set_variable_meta_data method.".to_vec();1929 assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));19301931 assert_eq!(TemplateModule::refungible_item_id(collection_id, 1).variable_data, variable_data);1932 });1933}193419351936#[test]1937fn set_variable_meta_data_on_fungible_token_fails() {1938 new_test_ext().execute_with(|| {1939 default_limits();19401941 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);19421943 let origin1 = Origin::signed(1);19441945 let data = default_fungible_data();1946 create_test_item(1, &data.into());19471948 let variable_data = b"test set_variable_meta_data method.".to_vec();1949 assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()), Error::<Test>::CantStoreMetadataInFungibleTokens);1950 });1951}19521953#[test]1954fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1955 new_test_ext().execute_with(|| {1956 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1957 collection_numbers_limit: default_collection_numbers_limit(),1958 account_token_ownership_limit: 10,1959 collections_admins_limit: 5,1960 custom_data_limit: 10,1961 nft_sponsor_transfer_timeout: 15,1962 fungible_sponsor_transfer_timeout: 15,1963 refungible_sponsor_transfer_timeout: 15, 1964 }));19651966 let collection_id = create_test_collection(&CollectionMode::NFT, 1);19671968 let origin1 = Origin::signed(1);19691970 let data = default_nft_data();1971 create_test_item(1, &data.into());19721973 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1974 assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1975 });1976}19771978#[test]1979fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1980 new_test_ext().execute_with(|| {1981 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1982 collection_numbers_limit: default_collection_numbers_limit(),1983 account_token_ownership_limit: 10,1984 collections_admins_limit: 5,1985 custom_data_limit: 10,1986 nft_sponsor_transfer_timeout: 15,1987 fungible_sponsor_transfer_timeout: 15,1988 refungible_sponsor_transfer_timeout: 15, 1989 }));199019911992 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);19931994 let origin1 = Origin::signed(1);19951996 let data = default_re_fungible_data();1997 create_test_item(1, &data.into());19981999 let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2000 assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);2001 });2002}