difftreelog
Merge pull request #16 from usetech-llc/feature/NFTPAR-142
in: master
Feature/nftpar-142
7 files changed
README.mddiffbeforeafterboth--- a/README.md
+++ b/README.md
@@ -167,9 +167,9 @@
"CollectionMode": {
"_enum": {
"Invalid": null,
- "NFT": "u32",
+ "NFT": null,
"Fungible": "u32",
- "ReFungible": "(u32, u32)"
+ "ReFungible": "u32"
}
},
"Ownership": {
@@ -189,7 +189,8 @@
"NftItemType": {
"Collection": "u64",
"Owner": "AccountId",
- "Data": "Vec<u8>"
+ "ConstData": "Vec<u8>",
+ "VariableData": "Vec<u8>"
},
"Ownership": {
"owner": "AccountId",
@@ -198,7 +199,8 @@
"ReFungibleItemType": {
"Collection": "u64",
"Owner": "Vec<Ownership<AccountId>>",
- "Data": "Vec<u8>"
+ "ConstData": "Vec<u8>",
+ "VariableData": "Vec<u8>"
},
"CollectionType": {
"Owner": "AccountId",
@@ -208,11 +210,12 @@
"Name": "Vec<u16>",
"Description": "Vec<u16>",
"TokenPrefix": "Vec<u8>",
- "CustomDataSize": "u32",
"MintMode": "bool",
"OffchainSchema": "Vec<u8>",
"Sponsor": "AccountId",
- "UnconfirmedSponsor": "AccountId"
+ "UnconfirmedSponsor": "AccountId",
+ "VariableOnChainSchema": "Vec<u8>",
+ "ConstOnChainSchema": "Vec<u8>"
},
"ApprovePermissions": {
"Approved": "AccountId",
@@ -221,7 +224,23 @@
"RawData": "Vec<u8>",
"Address": "AccountId",
"LookupSource": "AccountId",
- "Weight": "u64"
+ "Weight": "u64",
+ "CreateNftData": {
+ "const_data": "Vec<u8>",
+ "variable_data": "Vec<u8>"
+ },
+ "CreateFungibleData": {},
+ "CreateReFungibleData": {
+ "const_data": "Vec<u8>",
+ "variable_data": "Vec<u8>"
+ },
+ "CreateItemData": {
+ "_enum": {
+ "NFT": "CreateNftData",
+ "Fungible": "CreateFungibleData",
+ "ReFungible": "CreateReFungibleData"
+ }
+ }
}
```
\ No newline at end of file
node/src/chain_spec.rsdiffbeforeafterboth--- a/node/src/chain_spec.rs
+++ b/node/src/chain_spec.rs
@@ -159,17 +159,18 @@
1,
CollectionType {
owner: get_account_id_from_seed::<sr25519::Public>("Alice"),
- mode: CollectionMode::NFT(50),
+ mode: CollectionMode::NFT,
access: AccessMode::Normal,
decimal_points: 0,
name: vec![],
description: vec![],
token_prefix: vec![],
- custom_data_size: 50,
mint_mode: false,
offchain_schema: vec![],
sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),
unconfirmed_sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),
+ const_on_chain_schema: vec![],
+ variable_on_chain_schema: vec![]
},
)],
nft_item_id: vec![],
pallets/nft/src/benchmarking.rsdiffbeforeafterboth--- a/pallets/nft/src/benchmarking.rs
+++ b/pallets/nft/src/benchmarking.rs
@@ -9,6 +9,19 @@
const SEED: u32 = 1;
+ fn default_nft_data() -> CreateItemData {
+ CreateItemData::NFT(CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] })
+ }
+
+ fn default_fungible_data () -> CreateItemData {
+ CreateItemData::Fungible(CreateFungibleData { })
+ }
+
+ fn default_re_fungible_data () -> CreateItemData {
+ CreateItemData::ReFungible(CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] })
+ }
+
+
benchmarks! {
_ {}
@@ -17,7 +30,7 @@
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT(2000);
+ let mode: CollectionMode = CollectionMode::NFT;
let caller: T::AccountId = account("caller", 0, SEED);
}: create_collection(RawOrigin::Signed(caller.clone()), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode)
verify {
@@ -28,7 +41,7 @@
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT(2000);
+ let mode: CollectionMode = CollectionMode::NFT;
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
}: destroy_collection(RawOrigin::Signed(caller.clone()), 2)
@@ -37,7 +50,7 @@
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT(2000);
+ let mode: CollectionMode = CollectionMode::NFT;
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
let whitelist_account: T::AccountId = account("admin", 0, SEED);
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
@@ -47,7 +60,7 @@
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT(2000);
+ let mode: CollectionMode = CollectionMode::NFT;
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
let whitelist_account: T::AccountId = account("admin", 0, SEED);
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
@@ -58,7 +71,7 @@
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT(2000);
+ let mode: CollectionMode = CollectionMode::NFT;
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
}: set_public_access_mode(RawOrigin::Signed(caller.clone()), 2, AccessMode::WhiteList)
@@ -67,7 +80,7 @@
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT(2000);
+ let mode: CollectionMode = CollectionMode::NFT;
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
}: set_mint_permission(RawOrigin::Signed(caller.clone()), 2, true)
@@ -76,7 +89,7 @@
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT(2000);
+ let mode: CollectionMode = CollectionMode::NFT;
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
let new_owner: T::AccountId = account("admin", 0, SEED);
@@ -86,7 +99,7 @@
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT(2000);
+ let mode: CollectionMode = CollectionMode::NFT;
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
let new_admin: T::AccountId = account("admin", 0, SEED);
@@ -96,7 +109,7 @@
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT(2000);
+ let mode: CollectionMode = CollectionMode::NFT;
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
let new_admin: T::AccountId = account("admin", 0, SEED);
@@ -107,7 +120,7 @@
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT(2000);
+ let mode: CollectionMode = CollectionMode::NFT;
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
}: set_collection_sponsor(RawOrigin::Signed(caller.clone()), 2, caller.clone())
@@ -116,7 +129,7 @@
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT(2000);
+ let mode: CollectionMode = CollectionMode::NFT;
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
Nft::<T>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?;
@@ -126,7 +139,7 @@
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT(2000);
+ let mode: CollectionMode = CollectionMode::NFT;
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
Nft::<T>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?;
@@ -138,26 +151,32 @@
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT(2000);
+ let mode: CollectionMode = CollectionMode::NFT;
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
-
- }: create_item(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec(), caller.clone())
+ let data = default_nft_data();
+
+ }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
#[extra]
create_item_nft_large {
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT(2000);
+ let mode: CollectionMode = CollectionMode::NFT;
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
- let mut item_large: Vec<u8> = Vec::new();
+ let nft_data = CreateNftData {
+ const_data: vec![],
+ variable_data: vec![]
+ };
for i in 0..1998 {
- item_large.push(10);
+ nft_data.const_data.push(10);
+ nft_data.variable_data.push(10);
}
+ let mut data = CreateItemData::NFT(nft_data);
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- }: create_item(RawOrigin::Signed(caller.clone()), 2, item_large, caller.clone())
+ }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
// fungible item
create_item_fungible {
@@ -167,28 +186,31 @@
let mode: CollectionMode = CollectionMode::Fungible(3);
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ let data = default_fungible_data();
- }: create_item(RawOrigin::Signed(caller.clone()), 2, [].to_vec(), caller.clone())
+ }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
// refungible item
create_item_refungible {
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::ReFungible(3, 3);
+ let mode: CollectionMode = CollectionMode::ReFungible(3);
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ let data = default_re_fungible_data();
- }: create_item(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec(), caller.clone())
+ }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
burn_item {
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT(2000);
+ let mode: CollectionMode = CollectionMode::NFT;
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1, 2, 3].to_vec(), caller.clone())?;
+ let data = default_nft_data();
+ Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
}: burn_item(RawOrigin::Signed(caller.clone()), 2, 1)
@@ -196,11 +218,12 @@
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT(2000);
+ let mode: CollectionMode = CollectionMode::NFT;
let recipient: T::AccountId = account("recipient", 0, SEED);
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1, 2, 3].to_vec(), caller.clone())?;
+ let data = default_nft_data();
+ Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
}: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)
@@ -212,7 +235,8 @@
let recipient: T::AccountId = account("recipient", 0, SEED);
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [].to_vec(), caller.clone())?;
+ let data = default_fungible_data();
+ Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
}: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)
@@ -220,11 +244,12 @@
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::ReFungible(3,3);
+ let mode: CollectionMode = CollectionMode::ReFungible(3);
let recipient: T::AccountId = account("recipient", 0, SEED);
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?;
+ let data = default_re_fungible_data();
+ Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
}: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)
@@ -232,11 +257,12 @@
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::ReFungible(3,3);
+ let mode: CollectionMode = CollectionMode::ReFungible(3);
let recipient: T::AccountId = account("recipient", 0, SEED);
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?;
+ let data = default_re_fungible_data();
+ Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
}: approve(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1)
@@ -245,11 +271,12 @@
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::NFT(300);
+ let mode: CollectionMode = CollectionMode::NFT;
let recipient: T::AccountId = account("recipient", 0, SEED);
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?;
+ let data = default_nft_data();
+ Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;
}: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)
@@ -263,7 +290,8 @@
let recipient: T::AccountId = account("recipient", 0, SEED);
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [].to_vec(), caller.clone())?;
+ let data = default_fungible_data();
+ Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;
}: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)
@@ -273,11 +301,12 @@
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::ReFungible(3,3);
+ let mode: CollectionMode = CollectionMode::ReFungible(3);
let recipient: T::AccountId = account("recipient", 0, SEED);
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
- Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?;
+ let data = default_re_fungible_data();
+ Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;
}: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)
@@ -286,9 +315,39 @@
let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
- let mode: CollectionMode = CollectionMode::ReFungible(3,3);
+ let mode: CollectionMode = CollectionMode::ReFungible(3);
let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
}: set_offchain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())
- }
\ No newline at end of file
+
+ set_const_on_chain_schema {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::ReFungible(3);
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ }: set_const_on_chain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())
+
+ set_variable_on_chain_schema {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::ReFungible(3);
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ }: set_variable_on_chain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())
+
+ set_variable_meta_data {
+ let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
+ let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
+ let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
+ let mode: CollectionMode = CollectionMode::NFT;
+ let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
+ Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
+ let data = default_nft_data();
+ Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
+
+ }: set_variable_meta_data(RawOrigin::Signed(caller.clone()), 2, 1, [1, 2, 3].to_vec())
+}
\ No newline at end of file
pallets/nft/src/default_weights.rsdiffbeforeafterboth--- a/pallets/nft/src/default_weights.rs
+++ b/pallets/nft/src/default_weights.rs
@@ -92,6 +92,21 @@
.saturating_add(DbWeight::get().reads(2 as Weight))
.saturating_add(DbWeight::get().writes(1 as Weight))
}
+ fn set_const_on_chain_schema() -> Weight {
+ (11_100_000 as Weight)
+ .saturating_add(DbWeight::get().reads(2 as Weight))
+ .saturating_add(DbWeight::get().writes(1 as Weight))
+ }
+ fn set_variable_on_chain_schema() -> Weight {
+ (11_100_000 as Weight)
+ .saturating_add(DbWeight::get().reads(2 as Weight))
+ .saturating_add(DbWeight::get().writes(1 as Weight))
+ }
+ fn set_variable_meta_data() -> Weight {
+ (17_500_000 as Weight)
+ .saturating_add(DbWeight::get().reads(2 as Weight))
+ .saturating_add(DbWeight::get().writes(1 as Weight))
+ }
// fn enable_contract_sponsoring() -> Weight {
// (0 as Weight)
// .saturating_add(DbWeight::get().reads(1 as Weight))
pallets/nft/src/lib.rsdiffbeforeafterboth--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -10,7 +10,7 @@
pub use frame_support::{
construct_runtime, decl_event, decl_module, decl_storage,
dispatch::DispatchResult,
- ensure, parameter_types,
+ ensure, parameter_types, fail,
traits::{
Currency, ExistenceRequirement, Get, Imbalance, KeyOwnerProofSystem, OnUnbalanced,
Randomness, WithdrawReason,
@@ -53,21 +53,20 @@
#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
pub enum CollectionMode {
Invalid,
- // custom data size
- NFT(u32),
+ NFT,
// decimal points
Fungible(u32),
- // custom data size and decimal points
- ReFungible(u32, u32),
+ // decimal points
+ ReFungible(u32),
}
impl Into<u8> for CollectionMode {
fn into(self) -> u8 {
match self {
CollectionMode::Invalid => 0,
- CollectionMode::NFT(_) => 1,
+ CollectionMode::NFT => 1,
CollectionMode::Fungible(_) => 2,
- CollectionMode::ReFungible(_, _) => 3,
+ CollectionMode::ReFungible(_) => 3,
}
}
}
@@ -107,11 +106,12 @@
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
- pub custom_data_size: u32,
pub mint_mode: bool,
pub offchain_schema: Vec<u8>,
pub sponsor: AccountId, // Who pays fees. If set to default address, the fees are applied to the transaction sender
pub unconfirmed_sponsor: AccountId, // Sponsor address that has not yet confirmed sponsorship
+ pub variable_on_chain_schema: Vec<u8>, //
+ pub const_on_chain_schema: Vec<u8>, //
}
#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
@@ -126,7 +126,8 @@
pub struct NftItemType<AccountId> {
pub collection: u64,
pub owner: AccountId,
- pub data: Vec<u8>,
+ pub const_data: Vec<u8>,
+ pub variable_data: Vec<u8>,
}
#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
@@ -142,7 +143,8 @@
pub struct ReFungibleItemType<AccountId> {
pub collection: u64,
pub owner: Vec<Ownership<AccountId>>,
- pub data: Vec<u8>,
+ pub const_data: Vec<u8>,
+ pub variable_data: Vec<u8>,
}
#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
@@ -197,15 +199,75 @@
fn set_collection_sponsor() -> Weight;
fn confirm_sponsorship() -> Weight;
fn remove_collection_sponsor() -> Weight;
- fn create_item(s: usize, ) -> Weight;
+ fn create_item(s: usize) -> Weight;
fn burn_item() -> Weight;
fn transfer() -> Weight;
fn approve() -> Weight;
fn transfer_from() -> Weight;
fn set_offchain_schema() -> Weight;
+ fn set_const_on_chain_schema() -> Weight;
+ fn set_variable_on_chain_schema() -> Weight;
+ fn set_variable_meta_data() -> Weight;
// fn enable_contract_sponsoring() -> Weight;
}
+#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+pub struct CreateNftData {
+ pub const_data: Vec<u8>,
+ pub variable_data: Vec<u8>,
+}
+
+#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+pub struct CreateFungibleData {
+}
+
+#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+pub struct CreateReFungibleData {
+ pub const_data: Vec<u8>,
+ pub variable_data: Vec<u8>,
+}
+
+#[derive(Encode, Decode, Debug, Clone, PartialEq)]
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+pub enum CreateItemData {
+ NFT(CreateNftData),
+ Fungible(CreateFungibleData),
+ ReFungible(CreateReFungibleData)
+}
+
+impl CreateItemData {
+ pub fn len(&self) -> usize {
+ let len = match self {
+ CreateItemData::NFT(data) => data.variable_data.len() + data.const_data.len(),
+ CreateItemData::ReFungible(data) => data.variable_data.len() + data.const_data.len(),
+ _ => 0
+ };
+
+ return len;
+ }
+}
+
+impl From<CreateNftData> for CreateItemData {
+ fn from(item: CreateNftData) -> Self {
+ CreateItemData::NFT(item)
+ }
+}
+
+impl From<CreateReFungibleData> for CreateItemData {
+ fn from(item: CreateReFungibleData) -> Self {
+ CreateItemData::ReFungible(item)
+ }
+}
+
+impl From<CreateFungibleData> for CreateItemData {
+ fn from(item: CreateFungibleData) -> Self {
+ CreateItemData::Fungible(item)
+ }
+}
+
pub trait Trait: system::Trait + Sized + transaction_payment::Trait + pallet_contracts::Trait {
type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
@@ -362,25 +424,10 @@
// Anyone can create a collection
let who = ensure_signed(origin)?;
- let custom_data_size = match mode {
- CollectionMode::NFT(size) => {
- // bound Custom data size
- ensure!(size < ChainLimit::get().custom_data_limit, "Custom data size bound exceeded");
- size
- },
- CollectionMode::ReFungible(size, _) => {
-
- // bound Custom data size
- ensure!(size < ChainLimit::get().custom_data_limit, "Custom data size bound exceeded");
- size
- },
- _ => 0
- };
-
let decimal_points = match mode {
CollectionMode::Fungible(points) => points,
- CollectionMode::ReFungible(_, points) => points,
+ CollectionMode::ReFungible(points) => points,
_ => 0
};
@@ -426,9 +473,10 @@
decimal_points: decimal_points,
token_prefix: prefix,
offchain_schema: Vec::new(),
- custom_data_size: custom_data_size,
sponsor: T::AccountId::default(),
unconfirmed_sponsor: T::AccountId::default(),
+ variable_on_chain_schema: Vec::new(),
+ const_on_chain_schema: Vec::new(),
};
// Add new collection to map
@@ -441,7 +489,7 @@
}
/// **DANGEROUS**: Destroys collection and all NFTs within this collection. Users irrecoverably lose their assets and may lose real money.
- ///
+ ///
/// # Permissions
///
/// * Collection Owner.
@@ -771,77 +819,88 @@
///
/// * collection_id: ID of the collection.
///
- /// * properties: Array of bytes that contains NFT properties. Since NFT Module is agnostic of properties meaning, it is treated purely as an array of bytes.
- ///
/// * owner: Address, initial owner of the NFT.
+ ///
+ /// * data: Token data to store on chain.
// #[weight =
// (130_000_000 as Weight)
// .saturating_add((2135 as Weight).saturating_mul((properties.len() as u64) as Weight))
// .saturating_add(RocksDbWeight::get().reads(10 as Weight))
// .saturating_add(RocksDbWeight::get().writes(8 as Weight))]
- #[weight = T::WeightInfo::create_item(properties.len())]
- pub fn create_item(origin, collection_id: u64, properties: Vec<u8>, owner: T::AccountId) -> DispatchResult {
+ #[weight = T::WeightInfo::create_item(data.len())]
+ pub fn create_item(origin, collection_id: u64, owner: T::AccountId, data: CreateItemData) -> DispatchResult {
let sender = ensure_signed(origin)?;
Self::collection_exists(collection_id)?;
let target_collection = <Collection<T>>::get(collection_id);
if !Self::is_owner_or_admin_permissions(collection_id, sender.clone()) {
- ensure!(target_collection.mint_mode == true, "Public minting is not allowed for this collection");
+ ensure!(target_collection.mint_mode == true, "Public minting is not allowed for this collection.");
Self::check_white_list(collection_id, &owner)?;
Self::check_white_list(collection_id, &sender)?;
}
match target_collection.mode
{
- CollectionMode::NFT(_) => {
-
- // check size
- ensure!(target_collection.custom_data_size >= properties.len() as u32, "Size of item is too large");
-
- // Create nft item
- let item = NftItemType {
- collection: collection_id,
- owner: owner,
- data: properties.clone(),
- };
-
- Self::add_nft_item(item)?;
-
+ CollectionMode::NFT => {
+ if let CreateItemData::NFT(data) = data {
+ // check sizes
+ ensure!(ChainLimit::get().custom_data_limit >= data.const_data.len() as u32, "const_data exceeded data limit.");
+ ensure!(ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32, "variable_data exceeded data limit.");
+
+ // Create nft item
+ let item = NftItemType {
+ collection: collection_id,
+ owner: owner,
+ const_data: data.const_data.clone(),
+ variable_data: data.variable_data.clone()
+ };
+
+ Self::add_nft_item(item)?;
+
+ } else {
+ fail!("Not NFT item data used to mint in NFT collection.");
+ }
},
CollectionMode::Fungible(_) => {
-
- // check size
- ensure!(properties.len() as u32 == 0, "Size of item must be 0 with fungible type");
-
- let item = FungibleItemType {
- collection: collection_id,
- owner: owner,
- value: (10 as u128).pow(target_collection.decimal_points)
- };
-
- Self::add_fungible_item(item)?;
+ if let CreateItemData::Fungible(_) = data {
+
+ let item = FungibleItemType {
+ collection: collection_id,
+ owner: owner,
+ value: (10 as u128).pow(target_collection.decimal_points)
+ };
+
+ Self::add_fungible_item(item)?;
+ } else {
+ fail!("Not Fungible item data used to mint in Fungible collection.");
+ }
},
- CollectionMode::ReFungible(_, _) => {
-
- // check size
- ensure!(target_collection.custom_data_size >= properties.len() as u32, "Size of item is too large");
-
- let mut owner_list = Vec::new();
- let value = (10 as u128).pow(target_collection.decimal_points);
- owner_list.push(Ownership {owner: owner.clone(), fraction: value});
-
- let item = ReFungibleItemType {
- collection: collection_id,
- owner: owner_list,
- data: properties.clone()
- };
-
- Self::add_refungible_item(item)?;
+ CollectionMode::ReFungible(_) => {
+ if let CreateItemData::ReFungible(data) = data {
+
+ // check sizes
+ ensure!(ChainLimit::get().custom_data_limit >= data.const_data.len() as u32, "const_data exceeded data limit.");
+ ensure!(ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32, "variable_data exceeded data limit.");
+
+ let mut owner_list = Vec::new();
+ let value = (10 as u128).pow(target_collection.decimal_points);
+ owner_list.push(Ownership {owner: owner.clone(), fraction: value});
+
+ let item = ReFungibleItemType {
+ collection: collection_id,
+ owner: owner_list,
+ const_data: data.const_data.clone(),
+ variable_data: data.variable_data.clone()
+ };
+
+ Self::add_refungible_item(item)?;
+ } else {
+ fail!("Not Re Fungible item data used to mint in Re Fungible collection.");
+ }
},
- _ => { ensure!(1 == 0,"just error"); }
-
+ _ => { ensure!(1 == 0,"Unexpected collection type."); }
};
// call event
@@ -881,9 +940,9 @@
match target_collection.mode
{
- CollectionMode::NFT(_) => Self::burn_nft_item(collection_id, item_id)?,
+ CollectionMode::NFT => Self::burn_nft_item(collection_id, item_id)?,
CollectionMode::Fungible(_) => Self::burn_fungible_item(collection_id, item_id)?,
- CollectionMode::ReFungible(_, _) => Self::burn_refungible_item(collection_id, item_id, sender.clone())?,
+ CollectionMode::ReFungible(_) => Self::burn_refungible_item(collection_id, item_id, sender.clone())?,
_ => ()
};
@@ -934,9 +993,9 @@
match target_collection.mode
{
- CollectionMode::NFT(_) => Self::transfer_nft(collection_id, item_id, sender.clone(), recipient)?,
+ CollectionMode::NFT => Self::transfer_nft(collection_id, item_id, sender.clone(), recipient)?,
CollectionMode::Fungible(_) => Self::transfer_fungible(collection_id, item_id, value, sender.clone(), recipient)?,
- CollectionMode::ReFungible(_, _) => Self::transfer_refungible(collection_id, item_id, value, sender.clone(), recipient)?,
+ CollectionMode::ReFungible(_) => Self::transfer_refungible(collection_id, item_id, value, sender.clone(), recipient)?,
_ => ()
};
@@ -1051,9 +1110,9 @@
match target_collection.mode
{
- CollectionMode::NFT(_) => Self::transfer_nft(collection_id, item_id, from, recipient)?,
+ CollectionMode::NFT => Self::transfer_nft(collection_id, item_id, from, recipient)?,
CollectionMode::Fungible(_) => Self::transfer_fungible(collection_id, item_id, value, from.clone(), recipient)?,
- CollectionMode::ReFungible(_, _) => Self::transfer_refungible(collection_id, item_id, value, from.clone(), recipient)?,
+ CollectionMode::ReFungible(_) => Self::transfer_refungible(collection_id, item_id, value, from.clone(), recipient)?,
_ => ()
};
@@ -1075,6 +1134,48 @@
Ok(())
}
+
+ /// Set off-chain data schema.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * schema: String representing the offchain data schema.
+ #[weight = T::WeightInfo::set_variable_meta_data()]
+ pub fn set_variable_meta_data (
+ origin,
+ collection_id: u64,
+ item_id: u64,
+ data: Vec<u8>
+ ) -> DispatchResult {
+ let sender = ensure_signed(origin)?;
+
+ Self::collection_exists(collection_id)?;
+
+ // Modify permissions check
+ let target_collection = <Collection<T>>::get(collection_id);
+ ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) ||
+ Self::is_owner_or_admin_permissions(collection_id, sender.clone()),
+ "Only item owner, collection owner and admins can modify item");
+
+ Self::item_exists(collection_id, item_id, &target_collection.mode)?;
+
+ match target_collection.mode
+ {
+ CollectionMode::NFT => Self::set_nft_variable_data(collection_id, item_id, data)?,
+ CollectionMode::ReFungible(_) => Self::set_re_fungible_variable_data(collection_id, item_id, data)?,
+ _ => ()
+ };
+
+ Ok(())
+ }
+
/// Set off-chain data schema.
///
@@ -1104,6 +1205,62 @@
Ok(())
}
+ /// Set const on-chain data schema.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * schema: String representing the const on-chain data schema.
+ #[weight = T::WeightInfo::set_const_on_chain_schema()]
+ pub fn set_const_on_chain_schema (
+ origin,
+ collection_id: u64,
+ schema: Vec<u8>
+ ) -> DispatchResult {
+ let sender = ensure_signed(origin)?;
+ Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;
+
+ let mut target_collection = <Collection<T>>::get(collection_id);
+ target_collection.const_on_chain_schema = schema;
+ <Collection<T>>::insert(collection_id, target_collection);
+
+ Ok(())
+ }
+
+ /// Set variable on-chain data schema.
+ ///
+ /// # Permissions
+ ///
+ /// * Collection Owner
+ /// * Collection Admin
+ ///
+ /// # Arguments
+ ///
+ /// * collection_id.
+ ///
+ /// * schema: String representing the variable on-chain data schema.
+ #[weight = T::WeightInfo::set_const_on_chain_schema()]
+ pub fn set_variable_on_chain_schema (
+ origin,
+ collection_id: u64,
+ schema: Vec<u8>
+ ) -> DispatchResult {
+ let sender = ensure_signed(origin)?;
+ Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;
+
+ let mut target_collection = <Collection<T>>::get(collection_id);
+ target_collection.variable_on_chain_schema = schema;
+ <Collection<T>>::insert(collection_id, target_collection);
+
+ Ok(())
+ }
+
// Sudo permissions function
#[weight = 0]
pub fn set_chain_limits(
@@ -1353,13 +1510,13 @@
let target_collection = <Collection<T>>::get(collection_id);
match target_collection.mode {
- CollectionMode::NFT(_) => {
+ CollectionMode::NFT => {
<NftItemList<T>>::get(collection_id, item_id).owner == subject
}
CollectionMode::Fungible(_) => {
<FungibleItemList<T>>::get(collection_id, item_id).owner == subject
}
- CollectionMode::ReFungible(_, _) => {
+ CollectionMode::ReFungible(_) => {
<ReFungibleItemList<T>>::get(collection_id, item_id)
.owner
.iter()
@@ -1594,7 +1751,50 @@
<ApprovedList<T>>::remove(collection_id, (item_id, old_owner));
Ok(())
}
+
+ fn item_exists(
+ collection_id: u64,
+ item_id: u64,
+ mode: &CollectionMode
+ ) -> DispatchResult {
+ match mode {
+ CollectionMode::NFT => ensure!(<NftItemList<T>>::contains_key(collection_id, item_id), "Item does not exists"),
+ CollectionMode::ReFungible(_) => ensure!(<ReFungibleItemList<T>>::contains_key(collection_id, item_id), "Item does not exists"),
+ CollectionMode::Fungible(_) => ensure!(<FungibleItemList<T>>::contains_key(collection_id, item_id), "Item does not exists"),
+ _ => ()
+ };
+
+ Ok(())
+ }
+
+ fn set_re_fungible_variable_data(
+ collection_id: u64,
+ item_id: u64,
+ data: Vec<u8>
+ ) -> DispatchResult {
+ let mut item = <ReFungibleItemList<T>>::get(collection_id, item_id);
+
+ item.variable_data = data;
+ <ReFungibleItemList<T>>::insert(collection_id, item_id, item);
+
+ Ok(())
+ }
+
+ fn set_nft_variable_data(
+ collection_id: u64,
+ item_id: u64,
+ data: Vec<u8>
+ ) -> DispatchResult {
+ let mut item = <NftItemList<T>>::get(collection_id, item_id);
+
+ item.variable_data = data;
+
+ <NftItemList<T>>::insert(collection_id, item_id, item);
+
+ Ok(())
+ }
+
fn init_collection(item: &CollectionType<T::AccountId>) {
// check params
assert!(
@@ -1835,7 +2035,7 @@
// sponsor timeout
let sponsor_transfer = match _collection_mode {
- CollectionMode::NFT(_) => {
+ CollectionMode::NFT => {
let basket = <NftTransferBasket<T>>::get(collection_id, _item_id);
let block_number = <system::Module<T>>::block_number() as T::BlockNumber;
let limit_time = basket + ChainLimit::get().nft_sponsor_transfer_timeout.into();
@@ -1869,7 +2069,7 @@
true
}
}
- CollectionMode::ReFungible(_, _) => {
+ CollectionMode::ReFungible(_) => {
let basket = <ReFungibleTransferBasket<T>>::get(collection_id, _item_id);
let block_number = <system::Module<T>>::block_number() as T::BlockNumber;
let limit_time = basket + ChainLimit::get().nft_sponsor_transfer_timeout.into();
pallets/nft/src/tests.rsdiffbeforeafterboth1// Tests to be written here1// Tests to be written here2use crate::mock::*;2use crate::mock::*;3use crate::{AccessMode, ApprovePermissions, CollectionMode, Ownership, ChainLimits};3use crate::{AccessMode, ApprovePermissions, CollectionMode, Ownership, ChainLimits, CreateItemData, CreateNftData, CreateFungibleData, CreateReFungibleData};4use frame_support::{assert_noop, assert_ok};4use frame_support::{assert_noop, assert_ok};5use frame_system::{ RawOrigin };5use frame_system::{ RawOrigin };667// Use cases tests region8// #region9#[test]10fn create_nft_item() {7fn default_collection_numbers_limit() -> u64 {11 new_test_ext().execute_with(|| {12 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();8 1013 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();9}14 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();15 let mode: CollectionMode = CollectionMode::NFT(2000);161017 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 11fn default_limits() {12 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 18 collection_numbers_limit: 10,13 collection_numbers_limit: default_collection_numbers_limit(),19 account_token_ownership_limit: 10,14 account_token_ownership_limit: 10,20 collections_admins_limit: 5,15 collections_admins_limit: 5,21 custom_data_limit: 2048,16 custom_data_limit: 2048,22 nft_sponsor_transfer_timeout: 15,17 nft_sponsor_transfer_timeout: 15,23 fungible_sponsor_transfer_timeout: 15,18 fungible_sponsor_transfer_timeout: 15,24 refungible_sponsor_transfer_timeout: 15, 19 refungible_sponsor_transfer_timeout: 15, 25 }));20 }));21}262227 let origin1 = Origin::signed(1);23fn default_nft_data() -> CreateNftData {24 CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }25}2627fn default_fungible_data () -> CreateFungibleData {28 CreateFungibleData { }29}3031fn default_re_fungible_data () -> CreateReFungibleData {32 CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }33}3435fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64, id: u64) -> u64 {36 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();28 assert_ok!(TemplateModule::create_collection(37 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();38 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();3940 let origin1 = Origin::signed(owner);41 assert_ok!(TemplateModule::create_collection(29 origin1.clone(),42 origin1.clone(),30 col_name1.clone(),43 col_name1.clone(),31 col_desc1.clone(),44 col_desc1.clone(),32 token_prefix1.clone(),45 token_prefix1.clone(),33 mode46 mode.clone()34 ));47 ));35 assert_eq!(TemplateModule::collection(1).owner, 1);364837 assert_ok!(TemplateModule::create_item(49 let saved_col_name: Vec<u16> = "Test1\0\0".encode_utf16().collect::<Vec<u16>>();50 let saved_description: Vec<u16> = "TestDescription1\0\0".encode_utf16().collect::<Vec<u16>>();51 let saved_prefix: Vec<u8> = b"token_prefix1\0\0".to_vec();52 assert_eq!(TemplateModule::collection(id).owner, owner);53 assert_eq!(TemplateModule::collection(id).name, saved_col_name);54 assert_eq!(TemplateModule::collection(id).mode, *mode);55 assert_eq!(TemplateModule::collection(id).description, saved_description);56 assert_eq!(TemplateModule::collection(id).token_prefix, saved_prefix);57 id58}5960fn create_test_collection(mode: &CollectionMode, id: u64) -> u64 {61 create_test_collection_for_owner(&mode, 1, id)62}6364fn create_test_item(collection_id: u64, data: &CreateItemData) {65 let origin1 = Origin::signed(1);66 assert_ok!(TemplateModule::create_item(38 origin1.clone(),67 origin1.clone(),68 collection_id,39 1,69 1,40 [1, 2, 3].to_vec(),70 data.clone()41 142 ));71 ));7273}7443 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());75// Use cases tests region76// #region77#[test]78fn create_nft_item() {79 new_test_ext().execute_with(|| {80 default_limits();81 let collection_id = create_test_collection(&CollectionMode::NFT, 1);82 83 let data = default_nft_data();84 create_test_item(collection_id, &data.clone().into());85 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).const_data, data.const_data);86 assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, data.variable_data);44 });87 });45}88}468947#[test]90#[test]48fn create_refungible_item() {91fn create_refungible_item() {49 new_test_ext().execute_with(|| {92 new_test_ext().execute_with(|| {50 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();93 default_limits();51 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();94 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);52 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();53 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);549555 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 96 let data = default_re_fungible_data();56 collection_numbers_limit: 10,57 account_token_ownership_limit: 10,58 collections_admins_limit: 5,59 custom_data_limit: 2048,60 nft_sponsor_transfer_timeout: 15,61 fungible_sponsor_transfer_timeout: 15,62 refungible_sponsor_transfer_timeout: 15, 63 }));6465 let origin1 = Origin::signed(1);66 assert_ok!(TemplateModule::create_collection(97 create_test_item(collection_id, &data.clone().into());67 origin1.clone(),68 col_name1.clone(),69 col_desc1.clone(),70 token_prefix1.clone(),71 mode72 ));73 assert_eq!(TemplateModule::collection(1).owner, 1);7475 assert_ok!(TemplateModule::create_item(76 origin1.clone(),77 1,78 [1, 2, 3].to_vec(),79 180 ));81 assert_eq!(98 assert_eq!(82 TemplateModule::refungible_item_id(1, 1).data,99 TemplateModule::refungible_item_id(collection_id, 1).const_data,83 [1, 2, 3].to_vec()100 data.const_data84 );101 );85 assert_eq!(102 assert_eq!(86 TemplateModule::refungible_item_id(1, 1).owner[0],103 TemplateModule::refungible_item_id(collection_id, 1).variable_data,104 data.variable_data105 );106 assert_eq!(107 TemplateModule::refungible_item_id(collection_id, 1).owner[0],87 Ownership {108 Ownership {88 owner: 1,109 owner: 1,89 fraction: 1000110 fraction: 100095#[test]116#[test]96fn create_fungible_item() {117fn create_fungible_item() {97 new_test_ext().execute_with(|| {118 new_test_ext().execute_with(|| {98 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();119 default_limits();99 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();120 100 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();121 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);101 let mode: CollectionMode = CollectionMode::Fungible(3);102122103 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 123 let data = default_fungible_data();104 collection_numbers_limit: 10,124 create_test_item(collection_id, &data.into());105 account_token_ownership_limit: 10,106 collections_admins_limit: 5,107 custom_data_limit: 2048,108 nft_sponsor_transfer_timeout: 15,109 fungible_sponsor_transfer_timeout: 15,110 refungible_sponsor_transfer_timeout: 15, 111 }));112125113 let origin1 = Origin::signed(1);126 assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).owner, 1);114 assert_ok!(TemplateModule::create_collection(115 origin1.clone(),116 col_name1.clone(),117 col_desc1.clone(),118 token_prefix1.clone(),119 mode120 ));121 assert_eq!(TemplateModule::collection(1).owner, 1);122123 assert_ok!(TemplateModule::create_item(124 origin1.clone(),125 1,126 [].to_vec(),127 1128 ));129 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);130 assert_eq!(TemplateModule::balance_count(1, 1), 1000);127 assert_eq!(TemplateModule::balance_count(1, 1), 1000);131 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);128 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);132 });129 });135#[test]132#[test]136fn transfer_fungible_item() {133fn transfer_fungible_item() {137 new_test_ext().execute_with(|| {134 new_test_ext().execute_with(|| {138 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();135 default_limits();139 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();136 140 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();137 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);141 let mode: CollectionMode = CollectionMode::Fungible(3);142138143 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 144 collection_numbers_limit: 10,145 account_token_ownership_limit: 10,146 collections_admins_limit: 5,147 custom_data_limit: 2048,148 nft_sponsor_transfer_timeout: 15,149 fungible_sponsor_transfer_timeout: 15,150 refungible_sponsor_transfer_timeout: 15, 151 }));152153 let origin1 = Origin::signed(1);139 let origin1 = Origin::signed(1);154 let origin2 = Origin::signed(2);140 let origin2 = Origin::signed(2);155 assert_ok!(TemplateModule::create_collection(156 origin1.clone(),157 col_name1.clone(),158 col_desc1.clone(),159 token_prefix1.clone(),160 mode161 ));162 assert_eq!(TemplateModule::collection(1).owner, 1);163141164 assert_ok!(TemplateModule::create_item(142 let data = default_fungible_data();165 origin1.clone(),166 1,143 create_test_item(collection_id, &data.into());167 [].to_vec(),144168 1169 ));170 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);145 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);171 assert_eq!(TemplateModule::balance_count(1, 1), 1000);146 assert_eq!(TemplateModule::balance_count(1, 1), 1000);172 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);147 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);203#[test]178#[test]204fn transfer_refungible_item() {179fn transfer_refungible_item() {205 new_test_ext().execute_with(|| {180 new_test_ext().execute_with(|| {206 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();181 default_limits();207 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();182 208 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();183 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);209 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);210184211 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 185 let data = default_re_fungible_data();212 collection_numbers_limit: 10,186 create_test_item(collection_id, &data.clone().into());213 account_token_ownership_limit: 10,214 collections_admins_limit: 5,215 custom_data_limit: 2048,216 nft_sponsor_transfer_timeout: 15,217 fungible_sponsor_transfer_timeout: 15,218 refungible_sponsor_transfer_timeout: 15, 219 }));220187221 let origin1 = Origin::signed(1);188 let origin1 = Origin::signed(1);222 let origin2 = Origin::signed(2);189 let origin2 = Origin::signed(2);223 assert_ok!(TemplateModule::create_collection(224 origin1.clone(),225 col_name1.clone(),226 col_desc1.clone(),227 token_prefix1.clone(),228 mode229 ));230 assert_eq!(TemplateModule::collection(1).owner, 1);231232 assert_ok!(TemplateModule::create_item(233 origin1.clone(),234 1,235 [1, 2, 3].to_vec(),236 1237 ));238 assert_eq!(190 assert_eq!(239 TemplateModule::refungible_item_id(1, 1).data,191 TemplateModule::refungible_item_id(collection_id, 1).const_data,240 [1, 2, 3].to_vec()192 data.const_data241 );193 );242 assert_eq!(194 assert_eq!(243 TemplateModule::refungible_item_id(1, 1).owner[0],195 TemplateModule::refungible_item_id(collection_id, 1).variable_data,196 data.variable_data197 );198 assert_eq!(199 TemplateModule::refungible_item_id(collection_id, 1).owner[0],244 Ownership {200 Ownership {245 owner: 1,201 owner: 1,246 fraction: 1000202 fraction: 1000310#[test]266#[test]311fn transfer_nft_item() {267fn transfer_nft_item() {312 new_test_ext().execute_with(|| {268 new_test_ext().execute_with(|| {313 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();269 default_limits();314 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();270 315 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();271 let collection_id = create_test_collection(&CollectionMode::NFT, 1);316 let mode: CollectionMode = CollectionMode::NFT(2000);317272318 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 273 let data = default_nft_data();319 collection_numbers_limit: 10,320 account_token_ownership_limit: 10,321 collections_admins_limit: 5,322 custom_data_limit: 2048,323 nft_sponsor_transfer_timeout: 15,324 fungible_sponsor_transfer_timeout: 15,325 refungible_sponsor_transfer_timeout: 15, 326 }));327328 let origin1 = Origin::signed(1);329 assert_ok!(TemplateModule::create_collection(274 create_test_item(collection_id, &data.into());330 origin1.clone(),331 col_name1.clone(),332 col_desc1.clone(),333 token_prefix1.clone(),334 mode335 ));336 assert_eq!(TemplateModule::collection(1).owner, 1);337338 assert_ok!(TemplateModule::create_item(339 origin1.clone(),340 1,341 [1, 2, 3].to_vec(),342 1343 ));344 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());345 assert_eq!(TemplateModule::balance_count(1, 1), 1);275 assert_eq!(TemplateModule::balance_count(1, 1), 1);346 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);276 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);347277278 let origin1 = Origin::signed(1);348 // default scenario279 // default scenario349 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));280 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));350 assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);281 assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);358#[test]289#[test]359fn nft_approve_and_transfer_from() {290fn nft_approve_and_transfer_from() {360 new_test_ext().execute_with(|| {291 new_test_ext().execute_with(|| {361 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();292 default_limits();362 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();293 363 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();294 let collection_id = create_test_collection(&CollectionMode::NFT, 1);364 let mode: CollectionMode = CollectionMode::NFT(2000);365295366 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 296 let data = default_nft_data();367 collection_numbers_limit: 10,297 create_test_item(collection_id, &data.into());368 account_token_ownership_limit: 10,369 collections_admins_limit: 5,370 custom_data_limit: 2048,371 nft_sponsor_transfer_timeout: 15,372 fungible_sponsor_transfer_timeout: 15,373 refungible_sponsor_transfer_timeout: 15, 374 }));375298376 let origin1 = Origin::signed(1);299 let origin1 = Origin::signed(1);377 let origin2 = Origin::signed(2);300 let origin2 = Origin::signed(2);378 assert_ok!(TemplateModule::create_collection(379 origin1.clone(),380 col_name1.clone(),381 col_desc1.clone(),382 token_prefix1.clone(),383 mode384 ));385 assert_eq!(TemplateModule::collection(1).owner, 1);386301387 assert_ok!(TemplateModule::create_item(388 origin1.clone(),389 1,390 [1, 2, 3].to_vec(),391 1392 ));393 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());394 assert_eq!(TemplateModule::balance_count(1, 1), 1);302 assert_eq!(TemplateModule::balance_count(1, 1), 1);395 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);303 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);396304429#[test]337#[test]430fn nft_approve_and_transfer_from_white_list() {338fn nft_approve_and_transfer_from_white_list() {431 new_test_ext().execute_with(|| {339 new_test_ext().execute_with(|| {432 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();340 default_limits();433 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();341 434 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();342 let collection_id = create_test_collection(&CollectionMode::NFT, 1);435 let mode: CollectionMode = CollectionMode::NFT(2000);436343437 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 438 collection_numbers_limit: 10,439 account_token_ownership_limit: 10,440 collections_admins_limit: 5,441 custom_data_limit: 2048,442 nft_sponsor_transfer_timeout: 15,443 fungible_sponsor_transfer_timeout: 15,444 refungible_sponsor_transfer_timeout: 15, 445 }));446447 let origin1 = Origin::signed(1);344 let origin1 = Origin::signed(1);448 let origin2 = Origin::signed(2);345 let origin2 = Origin::signed(2);449 assert_ok!(TemplateModule::create_collection(450 origin1.clone(),451 col_name1.clone(),452 col_desc1.clone(),453 token_prefix1.clone(),454 mode455 ));456 assert_eq!(TemplateModule::collection(1).owner, 1);457346458 assert_ok!(TemplateModule::create_item(347 let data = default_nft_data();459 origin1.clone(),460 1,348 create_test_item(collection_id, &data.clone().into());461 [1, 2, 3].to_vec(),349462 1463 ));464 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());350 assert_eq!(TemplateModule::nft_item_id(1, 1).const_data, data.const_data);465 assert_eq!(TemplateModule::balance_count(1, 1), 1);351 assert_eq!(TemplateModule::balance_count(1, 1), 1);466 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);352 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);467353507#[test]393#[test]508fn refungible_approve_and_transfer_from() {394fn refungible_approve_and_transfer_from() {509 new_test_ext().execute_with(|| {395 new_test_ext().execute_with(|| {510 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();396 default_limits();511 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();397 512 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();398 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);513 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);514515 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 399 516 collection_numbers_limit: 10,517 account_token_ownership_limit: 10,518 collections_admins_limit: 5,519 custom_data_limit: 2048,520 nft_sponsor_transfer_timeout: 15,521 fungible_sponsor_transfer_timeout: 15,522 refungible_sponsor_transfer_timeout: 15, 523 }));524525 let origin1 = Origin::signed(1);400 let origin1 = Origin::signed(1);526 let origin2 = Origin::signed(2);401 let origin2 = Origin::signed(2);527 assert_ok!(TemplateModule::create_collection(528 origin1.clone(),529 col_name1.clone(),530 col_desc1.clone(),531 token_prefix1.clone(),532 mode533 ));534 assert_eq!(TemplateModule::collection(1).owner, 1);535402536 assert_ok!(TemplateModule::create_item(403 let data = default_re_fungible_data();537 origin1.clone(),538 1,539 [1, 2, 3].to_vec(),540 1541 ));542 assert_eq!(404 create_test_item(collection_id, &data.into());543 TemplateModule::refungible_item_id(1, 1).data,405544 [1, 2, 3].to_vec()545 );546 assert_eq!(547 TemplateModule::refungible_item_id(1, 1).owner[0],548 Ownership {549 owner: 1,550 fraction: 1000551 }552 );553 assert_eq!(TemplateModule::balance_count(1, 1), 1000);406 assert_eq!(TemplateModule::balance_count(1, 1), 1000);554 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);407 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);555408607#[test]460#[test]608fn fungible_approve_and_transfer_from() {461fn fungible_approve_and_transfer_from() {609 new_test_ext().execute_with(|| {462 new_test_ext().execute_with(|| {610 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();463 default_limits();464 611 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();465 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);612 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();466 467 let data = default_fungible_data();613 let mode: CollectionMode = CollectionMode::Fungible(3);468 create_test_item(collection_id, &data.into());614469615 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 616 collection_numbers_limit: 10,617 account_token_ownership_limit: 10,618 collections_admins_limit: 5,619 custom_data_limit: 2048,620 nft_sponsor_transfer_timeout: 15,621 fungible_sponsor_transfer_timeout: 15,622 refungible_sponsor_transfer_timeout: 15, 623 }));624625 let origin1 = Origin::signed(1);470 let origin1 = Origin::signed(1);626 let origin2 = Origin::signed(2);471 let origin2 = Origin::signed(2);627 assert_ok!(TemplateModule::create_collection(628 origin1.clone(),629 col_name1.clone(),630 col_desc1.clone(),631 token_prefix1.clone(),632 mode633 ));634 assert_eq!(TemplateModule::collection(1).owner, 1);635472636 assert_ok!(TemplateModule::create_item(637 origin1.clone(),638 1,639 [].to_vec(),640 1641 ));642 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);643 assert_eq!(TemplateModule::balance_count(1, 1), 1000);473 assert_eq!(TemplateModule::balance_count(1, 1), 1000);644 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);474 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);645475713#[test]543#[test]714fn change_collection_owner() {544fn change_collection_owner() {715 new_test_ext().execute_with(|| {545 new_test_ext().execute_with(|| {716 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();546 default_limits();717 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();547 718 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();548 let collection_id = create_test_collection(&CollectionMode::NFT, 1);719 let mode: CollectionMode = CollectionMode::NFT(2000);720721 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 549 722 collection_numbers_limit: 10,723 account_token_ownership_limit: 10,724 collections_admins_limit: 5,725 custom_data_limit: 2048,726 nft_sponsor_transfer_timeout: 15,727 fungible_sponsor_transfer_timeout: 15,728 refungible_sponsor_transfer_timeout: 15, 729 }));730731 let origin1 = Origin::signed(1);550 let origin1 = Origin::signed(1);732 assert_ok!(TemplateModule::create_collection(733 origin1.clone(),734 col_name1.clone(),735 col_desc1.clone(),736 token_prefix1.clone(),737 mode738 ));739 assert_ok!(TemplateModule::change_collection_owner(551 assert_ok!(TemplateModule::change_collection_owner(740 origin1.clone(),552 origin1.clone(),741 1,553 collection_id,742 2554 2743 ));555 ));744 assert_eq!(TemplateModule::collection(1).owner, 2);556 assert_eq!(TemplateModule::collection(collection_id).owner, 2);745 });557 });746}558}747559748#[test]560#[test]749fn destroy_collection() {561fn destroy_collection() {750 new_test_ext().execute_with(|| {562 new_test_ext().execute_with(|| {751 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();563 default_limits();752 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();564 753 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();565 let collection_id = create_test_collection(&CollectionMode::NFT, 1);754 let mode: CollectionMode = CollectionMode::NFT(2000);755756 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 566 757 collection_numbers_limit: 10,758 account_token_ownership_limit: 10,759 collections_admins_limit: 5,760 custom_data_limit: 2048,761 nft_sponsor_transfer_timeout: 15,762 fungible_sponsor_transfer_timeout: 15,763 refungible_sponsor_transfer_timeout: 15, 764 }));765766 let origin1 = Origin::signed(1);567 let origin1 = Origin::signed(1);767 assert_ok!(TemplateModule::create_collection(568 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));768 origin1.clone(),769 col_name1.clone(),770 col_desc1.clone(),771 token_prefix1.clone(),772 mode773 ));774 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));775 });569 });776}570}777571778#[test]572#[test]779fn burn_nft_item() {573fn burn_nft_item() {780 new_test_ext().execute_with(|| {574 new_test_ext().execute_with(|| {781 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();575 default_limits();782 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();576 783 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();577 let collection_id = create_test_collection(&CollectionMode::NFT, 1);784 let mode: CollectionMode = CollectionMode::NFT(2000);785578786 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 787 collection_numbers_limit: 10,788 account_token_ownership_limit: 10,789 collections_admins_limit: 5,790 custom_data_limit: 2048,791 nft_sponsor_transfer_timeout: 15,792 fungible_sponsor_transfer_timeout: 15,793 refungible_sponsor_transfer_timeout: 15, 794 }));795796 let origin1 = Origin::signed(1);579 let origin1 = Origin::signed(1);797 assert_ok!(TemplateModule::create_collection(580 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));798 origin1.clone(),799 col_name1.clone(),800 col_desc1.clone(),801 token_prefix1.clone(),802 mode803 ));804 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));805 assert_ok!(TemplateModule::create_item(581 806 origin1.clone(),582 let data = default_nft_data();807 1,583 create_test_item(collection_id, &data.into());808 [1, 2, 3].to_vec(),809 1810 ));811584812 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());813814 // check balance (collection with id = 1, user id = 1)585 // check balance (collection with id = 1, user id = 1)815 assert_eq!(TemplateModule::balance_count(1, 1), 1);586 assert_eq!(TemplateModule::balance_count(1, 1), 1);816587828#[test]599#[test]829fn burn_fungible_item() {600fn burn_fungible_item() {830 new_test_ext().execute_with(|| {601 new_test_ext().execute_with(|| {831 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();602 default_limits();832 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();603 833 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();604 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);834 let mode: CollectionMode = CollectionMode::Fungible(3);835836 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 837 collection_numbers_limit: 10,605 838 account_token_ownership_limit: 10,839 collections_admins_limit: 5,840 custom_data_limit: 2048,841 nft_sponsor_transfer_timeout: 15,842 fungible_sponsor_transfer_timeout: 15,843 refungible_sponsor_transfer_timeout: 15, 844 }));845846 let origin1 = Origin::signed(1);606 let origin1 = Origin::signed(1);847 assert_ok!(TemplateModule::create_collection(607 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));848 origin1.clone(),849 col_name1.clone(),850 col_desc1.clone(),851 token_prefix1.clone(),852 mode853 ));854 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));855 assert_ok!(TemplateModule::create_item(608 856 origin1.clone(),609 let data = default_fungible_data();857 1,610 create_test_item(collection_id, &data.into());858 [].to_vec(),859 1860 ));861611862 // check balance (collection with id = 1, user id = 1)612 // check balance (collection with id = 1, user id = 1)863 assert_eq!(TemplateModule::balance_count(1, 1), 1000);613 assert_eq!(TemplateModule::balance_count(1, 1), 1000);876#[test]626#[test]877fn burn_refungible_item() {627fn burn_refungible_item() {878 new_test_ext().execute_with(|| {628 new_test_ext().execute_with(|| {879 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();629 default_limits();880 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();630 881 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();631 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);882 let mode: CollectionMode = CollectionMode::ReFungible(200, 3);883884 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 885 collection_numbers_limit: 10,886 account_token_ownership_limit: 10,887 collections_admins_limit: 5,888 custom_data_limit: 2048,889 nft_sponsor_transfer_timeout: 15,890 fungible_sponsor_transfer_timeout: 15,891 refungible_sponsor_transfer_timeout: 15, 892 }));893894 let origin1 = Origin::signed(1);632 let origin1 = Origin::signed(1);895 let origin2 = Origin::signed(2);896 assert_ok!(TemplateModule::create_collection(897 origin1.clone(),898 col_name1.clone(),899 col_desc1.clone(),900 token_prefix1.clone(),901 mode902 ));903633904 assert_ok!(TemplateModule::set_mint_permission(634 assert_ok!(TemplateModule::set_mint_permission(905 origin1.clone(),635 origin1.clone(),906 1,636 collection_id,907 true637 true908 ));638 ));909 assert_ok!(TemplateModule::set_public_access_mode(639 assert_ok!(TemplateModule::set_public_access_mode(910 origin1.clone(),640 origin1.clone(),911 1,641 collection_id,912 AccessMode::WhiteList642 AccessMode::WhiteList913 ));643 ));914 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));644 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));915645916 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));646 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));917 assert_ok!(TemplateModule::create_item(647 918 origin2.clone(),648 let data = default_re_fungible_data();919 1,649 create_test_item(collection_id, &data.into());920 [1, 2, 3].to_vec(),921 1922 ));923650924 assert_eq!(925 TemplateModule::refungible_item_id(1, 1).data,926 [1, 2, 3].to_vec()927 );928929 // check balance (collection with id = 1, user id = 2)651 // check balance (collection with id = 1, user id = 2)930 assert_eq!(TemplateModule::balance_count(1, 1), 1000);652 assert_eq!(TemplateModule::balance_count(1, 1), 1000);931653943#[test]665#[test]944fn add_collection_admin() {666fn add_collection_admin() {945 new_test_ext().execute_with(|| {667 new_test_ext().execute_with(|| {946 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();668 default_limits();947 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();669 948 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();670 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);949 let mode: CollectionMode = CollectionMode::NFT(2000);950951 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 671 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);952 collection_numbers_limit: 10,953 account_token_ownership_limit: 10,954 collections_admins_limit: 5,672 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);955 custom_data_limit: 2048,956 nft_sponsor_transfer_timeout: 15,957 fungible_sponsor_transfer_timeout: 15,958 refungible_sponsor_transfer_timeout: 15, 673 959 }));960961 let origin1 = Origin::signed(1);674 let origin1 = Origin::signed(1);962 let origin2 = Origin::signed(2);963 let origin3 = Origin::signed(3);964 assert_ok!(TemplateModule::create_collection(965 origin1.clone(),966 col_name1.clone(),967 col_desc1.clone(),968 token_prefix1.clone(),969 mode.clone()970 ));971 assert_ok!(TemplateModule::create_collection(972 origin2.clone(),973 col_name1.clone(),974 col_desc1.clone(),975 token_prefix1.clone(),976 mode.clone()977 ));978 assert_ok!(TemplateModule::create_collection(979 origin3.clone(),980 col_name1.clone(),981 col_desc1.clone(),982 token_prefix1.clone(),983 mode.clone()984 ));985675986 assert_eq!(TemplateModule::collection(1).owner, 1);987 assert_eq!(TemplateModule::collection(2).owner, 2);988 assert_eq!(TemplateModule::collection(3).owner, 3);989990 // collection admin676 // collection admin991 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));677 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));992 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));678 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));993679994 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);680 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&2), true);995 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);681 assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&3), true);996 });682 });997}683}998684999#[test]685#[test]1000fn remove_collection_admin() {686fn remove_collection_admin() {1001 new_test_ext().execute_with(|| {687 new_test_ext().execute_with(|| {1002 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();688 default_limits();689 1003 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();690 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);1004 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();691 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);1005 let mode: CollectionMode = CollectionMode::NFT(2000);692 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);10066931007 let origin1 = Origin::signed(1);694 let origin1 = Origin::signed(1);1008 let origin2 = Origin::signed(2);695 let origin2 = Origin::signed(2);1009 let origin3 = Origin::signed(3);10106961011 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1012 collection_numbers_limit: 10,1013 account_token_ownership_limit: 10,1014 collections_admins_limit: 5,1015 custom_data_limit: 2048,1016 nft_sponsor_transfer_timeout: 15,1017 fungible_sponsor_transfer_timeout: 15,1018 refungible_sponsor_transfer_timeout: 15, 1019 }));10201021 assert_ok!(TemplateModule::create_collection(1022 origin1.clone(),1023 col_name1.clone(),1024 col_desc1.clone(),1025 token_prefix1.clone(),1026 mode.clone()1027 ));1028 assert_ok!(TemplateModule::create_collection(1029 origin2.clone(),1030 col_name1.clone(),1031 col_desc1.clone(),1032 token_prefix1.clone(),1033 mode.clone()1034 ));1035 assert_ok!(TemplateModule::create_collection(1036 origin3.clone(),1037 col_name1.clone(),1038 col_desc1.clone(),1039 token_prefix1.clone(),1040 mode.clone()1041 ));10421043 assert_eq!(TemplateModule::collection(1).owner, 1);1044 assert_eq!(TemplateModule::collection(2).owner, 2);1045 assert_eq!(TemplateModule::collection(3).owner, 3);10461047 // collection admin697 // collection admin1048 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));698 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));1049 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));699 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));10507001051 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);701 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);1052 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);702 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);1064#[test]714#[test]1065fn balance_of() {715fn balance_of() {1066 new_test_ext().execute_with(|| {716 new_test_ext().execute_with(|| {1067 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();717 default_limits();1068 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();718 1069 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();719 let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);1070 let nft_mode: CollectionMode = CollectionMode::NFT(2000);1071 let furg_mode: CollectionMode = CollectionMode::Fungible(3);720 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);1072 let refung_mode: CollectionMode = CollectionMode::ReFungible(2000, 3);10731074 let origin1 = Origin::signed(1);721 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3), 3);10751076 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1077 collection_numbers_limit: 10,1078 account_token_ownership_limit: 10,1079 collections_admins_limit: 5,1080 custom_data_limit: 2048,1081 nft_sponsor_transfer_timeout: 15,1082 fungible_sponsor_transfer_timeout: 15,1083 refungible_sponsor_transfer_timeout: 15, 1084 }));10851086 assert_ok!(TemplateModule::create_collection(722 1087 origin1.clone(),1088 col_name1.clone(),1089 col_desc1.clone(),1090 token_prefix1.clone(),1091 nft_mode.clone()1092 ));1093 assert_ok!(TemplateModule::create_collection(1094 origin1.clone(),1095 col_name1.clone(),1096 col_desc1.clone(),1097 token_prefix1.clone(),1098 furg_mode.clone()1099 ));1100 assert_ok!(TemplateModule::create_collection(1101 origin1.clone(),1102 col_name1.clone(),1103 col_desc1.clone(),1104 token_prefix1.clone(),1105 refung_mode.clone()1106 ));11071108 assert_eq!(TemplateModule::collection(1).owner, 1);1109 assert_eq!(TemplateModule::collection(2).owner, 1);1110 assert_eq!(TemplateModule::collection(3).owner, 1);11111112 // check balance before723 // check balance before1113 assert_eq!(TemplateModule::balance_count(1, 1), 0);724 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);1114 assert_eq!(TemplateModule::balance_count(2, 1), 0);725 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);1115 assert_eq!(TemplateModule::balance_count(3, 1), 0);726 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 0);11167271117 // create item728 let nft_data = default_nft_data();1118 assert_ok!(TemplateModule::create_item(729 create_test_item(nft_collection_id, &nft_data.into());1119 origin1.clone(),730 1120 1,731 let fungible_data = default_fungible_data();1121 [1, 1, 1].to_vec(),732 create_test_item(fungible_collection_id, &fungible_data.into());733 1122 1734 let re_fungible_data = default_re_fungible_data();1123 ));735 create_test_item(re_fungible_collection_id, &re_fungible_data.into());11247361125 assert_ok!(TemplateModule::create_item(1126 origin1.clone(),1127 2,1128 [].to_vec(),1129 11130 ));11311132 assert_ok!(TemplateModule::create_item(1133 origin1.clone(),1134 3,1135 [1, 1, 1].to_vec(),1136 11137 ));11381139 // check balance (collection with id = 1, user id = 1)737 // check balance (collection with id = 1, user id = 1)1140 assert_eq!(TemplateModule::balance_count(1, 1), 1);738 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);1141 assert_eq!(TemplateModule::balance_count(2, 1), 1000);739 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 1000);1142 assert_eq!(TemplateModule::balance_count(3, 1), 1000);740 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1000);1143 assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 1);741 assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1);1144 assert_eq!(TemplateModule::fungible_item_id(2, 1).owner, 1);742 assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).owner, 1);1145 assert_eq!(TemplateModule::refungible_item_id(3, 1).owner[0].owner, 1);743 assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1);1146 });744 });1147}745}11487461149#[test]747#[test]1150fn approve() {748fn approve() {1151 new_test_ext().execute_with(|| {749 new_test_ext().execute_with(|| {1152 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();750 default_limits();751 1153 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();752 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1154 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();753 1155 let nft_mode: CollectionMode = CollectionMode::NFT(2000);754 let data = default_nft_data();1156 let origin1 = Origin::signed(1);755 create_test_item(collection_id, &data.into());11577561158 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 757 let origin1 = Origin::signed(1);1159 collection_numbers_limit: 10,1160 account_token_ownership_limit: 10,1161 collections_admins_limit: 5,1162 custom_data_limit: 2048,1163 nft_sponsor_transfer_timeout: 15,1164 fungible_sponsor_transfer_timeout: 15,1165 refungible_sponsor_transfer_timeout: 15, 1166 }));11671168 assert_ok!(TemplateModule::create_collection(1169 origin1.clone(),1170 col_name1.clone(),1171 col_desc1.clone(),1172 token_prefix1.clone(),1173 nft_mode.clone()1174 ));11751176 assert_eq!(TemplateModule::collection(1).owner, 1);11771178 // create item758 1179 assert_ok!(TemplateModule::create_item(1180 origin1.clone(),1181 1,1182 [1, 1, 1].to_vec(),1183 11184 ));11851186 // approve759 // approve1187 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));760 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));1192#[test]765#[test]1193fn transfer_from() {766fn transfer_from() {1194 new_test_ext().execute_with(|| {767 new_test_ext().execute_with(|| {1195 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();768 default_limits();1196 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();769 1197 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();770 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1198 let mode: CollectionMode = CollectionMode::NFT(2000);1199 let origin1 = Origin::signed(1);771 let origin1 = Origin::signed(1);1200 let origin2 = Origin::signed(2);772 let origin2 = Origin::signed(2);12017731202 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 774 let data = default_nft_data();1203 collection_numbers_limit: 10,775 create_test_item(collection_id, &data.into());1204 account_token_ownership_limit: 10,1205 collections_admins_limit: 5,1206 custom_data_limit: 2048,1207 nft_sponsor_transfer_timeout: 15,1208 fungible_sponsor_transfer_timeout: 15,1209 refungible_sponsor_transfer_timeout: 15, 1210 }));12117761212 assert_ok!(TemplateModule::create_collection(1213 origin1.clone(),1214 col_name1.clone(),1215 col_desc1.clone(),1216 token_prefix1.clone(),1217 mode1218 ));12191220 assert_eq!(TemplateModule::collection(1).owner, 1);12211222 // create item1223 assert_ok!(TemplateModule::create_item(1224 origin1.clone(),1225 1,1226 [1, 1, 1].to_vec(),1227 11228 ));12291230 // approve777 // approve1231 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));778 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));1232 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);779 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);1268#[test]815#[test]1269fn owner_can_add_address_to_white_list() {816fn owner_can_add_address_to_white_list() {1270 new_test_ext().execute_with(|| {817 new_test_ext().execute_with(|| {1271 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();818 default_limits();1272 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();819 1273 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();820 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1274 let mode: CollectionMode = CollectionMode::NFT(2000);1275 let origin1 = Origin::signed(1);12768211277 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 822 let origin1 = Origin::signed(1);1278 collection_numbers_limit: 10,1279 account_token_ownership_limit: 10,1280 collections_admins_limit: 5,1281 custom_data_limit: 2048,1282 nft_sponsor_transfer_timeout: 15,1283 fungible_sponsor_transfer_timeout: 15,1284 refungible_sponsor_transfer_timeout: 15, 1285 }));12861287 assert_ok!(TemplateModule::create_collection(1288 origin1.clone(),1289 col_name1.clone(),1290 col_desc1.clone(),1291 token_prefix1.clone(),1292 mode1293 ));12941295 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));823 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1296 assert_eq!(TemplateModule::white_list(1)[0], 2);824 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1297 });825 });1298}826}12998271300#[test]828#[test]1301fn admin_can_add_address_to_white_list() {829fn admin_can_add_address_to_white_list() {1302 new_test_ext().execute_with(|| {830 new_test_ext().execute_with(|| {1303 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();831 default_limits();1304 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();832 1305 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();833 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1306 let mode: CollectionMode = CollectionMode::NFT(2000);1307 let origin1 = Origin::signed(1);834 let origin1 = Origin::signed(1);1308 let origin2 = Origin::signed(2);835 let origin2 = Origin::signed(2);13098361310 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 837 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1311 collection_numbers_limit: 10,1312 account_token_ownership_limit: 10,1313 collections_admins_limit: 5,1314 custom_data_limit: 2048,1315 nft_sponsor_transfer_timeout: 15,1316 fungible_sponsor_transfer_timeout: 15,1317 refungible_sponsor_transfer_timeout: 15, 1318 }));13191320 assert_ok!(TemplateModule::create_collection(1321 origin1.clone(),1322 col_name1.clone(),1323 col_desc1.clone(),1324 token_prefix1.clone(),1325 mode1326 ));13271328 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1329 assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), 1, 3));838 assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3));1330 assert_eq!(TemplateModule::white_list(1)[0], 3);839 assert_eq!(TemplateModule::white_list(collection_id)[0], 3);1331 });840 });1332}841}13338421334#[test]843#[test]1335fn nonprivileged_user_cannot_add_address_to_white_list() {844fn nonprivileged_user_cannot_add_address_to_white_list() {1336 new_test_ext().execute_with(|| {845 new_test_ext().execute_with(|| {1337 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();846 default_limits();1338 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();847 1339 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();848 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1340 let mode: CollectionMode = CollectionMode::NFT(2000);1341 let origin1 = Origin::signed(1);1342 let origin2 = Origin::signed(2);13438491344 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 850 let origin2 = Origin::signed(2);1345 collection_numbers_limit: 10,1346 account_token_ownership_limit: 10,1347 collections_admins_limit: 5,1348 custom_data_limit: 2048,1349 nft_sponsor_transfer_timeout: 15,1350 fungible_sponsor_transfer_timeout: 15,1351 refungible_sponsor_transfer_timeout: 15, 1352 }));13531354 assert_ok!(TemplateModule::create_collection(1355 origin1.clone(),1356 col_name1.clone(),1357 col_desc1.clone(),1358 token_prefix1.clone(),1359 mode1360 ));13611362 assert_noop!(851 assert_noop!(1363 TemplateModule::add_to_white_list(origin2.clone(), 1, 3),852 TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3),1364 "You do not have permissions to modify this collection"853 "You do not have permissions to modify this collection"1365 );854 );1366 });855 });1369#[test]858#[test]1370fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {859fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {1371 new_test_ext().execute_with(|| {860 new_test_ext().execute_with(|| {861 default_limits();8621372 let origin1 = Origin::signed(1);863 let origin1 = Origin::signed(1);13738641374 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1375 collection_numbers_limit: 10,1376 account_token_ownership_limit: 10,1377 collections_admins_limit: 5,1378 custom_data_limit: 2048,1379 nft_sponsor_transfer_timeout: 15,1380 fungible_sponsor_transfer_timeout: 15,1381 refungible_sponsor_transfer_timeout: 15, 1382 }));13831384 assert_noop!(865 assert_noop!(1385 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),866 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),1386 "This collection does not exist"867 "This collection does not exist"1391#[test]872#[test]1392fn nobody_can_add_address_to_white_list_of_deleted_collection() {873fn nobody_can_add_address_to_white_list_of_deleted_collection() {1393 new_test_ext().execute_with(|| {874 new_test_ext().execute_with(|| {1394 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();875 default_limits();1395 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();876 1396 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();877 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1397 let mode: CollectionMode = CollectionMode::NFT(2000);1398 let origin1 = Origin::signed(1);13998781400 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 879 let origin1 = Origin::signed(1);1401 collection_numbers_limit: 10,1402 account_token_ownership_limit: 10,1403 collections_admins_limit: 5,1404 custom_data_limit: 2048,1405 nft_sponsor_transfer_timeout: 15,1406 fungible_sponsor_transfer_timeout: 15,1407 refungible_sponsor_transfer_timeout: 15, 1408 }));14091410 assert_ok!(TemplateModule::create_collection(1411 origin1.clone(),1412 col_name1.clone(),1413 col_desc1.clone(),1414 token_prefix1.clone(),1415 mode1416 ));14171418 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));880 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1419 assert_noop!(881 assert_noop!(1420 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),882 TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2),1421 "This collection does not exist"883 "This collection does not exist"1422 );884 );1423 });885 });1427#[test]889#[test]1428fn address_is_already_added_to_white_list() {890fn address_is_already_added_to_white_list() {1429 new_test_ext().execute_with(|| {891 new_test_ext().execute_with(|| {1430 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();892 default_limits();1431 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();893 1432 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();894 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1433 let mode: CollectionMode = CollectionMode::NFT(2000);1434 let origin1 = Origin::signed(1);895 let origin1 = Origin::signed(1);14351436 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 896 1437 collection_numbers_limit: 10,897 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1438 account_token_ownership_limit: 10,1439 collections_admins_limit: 5,1440 custom_data_limit: 2048,1441 nft_sponsor_transfer_timeout: 15,1442 fungible_sponsor_transfer_timeout: 15,1443 refungible_sponsor_transfer_timeout: 15, 1444 }));14451446 assert_ok!(TemplateModule::create_collection(1447 origin1.clone(),1448 col_name1.clone(),1449 col_desc1.clone(),1450 token_prefix1.clone(),1451 mode1452 ));14531454 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1455 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));898 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1456 assert_eq!(TemplateModule::white_list(1)[0], 2);899 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1457 assert_eq!(TemplateModule::white_list(1).len(), 1);900 assert_eq!(TemplateModule::white_list(collection_id).len(), 1);1458 });901 });1459}902}14609031461#[test]904#[test]1462fn owner_can_remove_address_from_white_list() {905fn owner_can_remove_address_from_white_list() {1463 new_test_ext().execute_with(|| {906 new_test_ext().execute_with(|| {1464 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();907 default_limits();1465 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();908 1466 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();909 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1467 let mode: CollectionMode = CollectionMode::NFT(2000);1468 let origin1 = Origin::signed(1);14699101470 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 911 let origin1 = Origin::signed(1);1471 collection_numbers_limit: 10,1472 account_token_ownership_limit: 10,1473 collections_admins_limit: 5,1474 custom_data_limit: 2048,1475 nft_sponsor_transfer_timeout: 15,1476 fungible_sponsor_transfer_timeout: 15,1477 refungible_sponsor_transfer_timeout: 15, 1478 }));14791480 assert_ok!(TemplateModule::create_collection(1481 origin1.clone(),1482 col_name1.clone(),1483 col_desc1.clone(),1484 token_prefix1.clone(),1485 mode1486 ));14871488 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));912 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1489 assert_ok!(TemplateModule::remove_from_white_list(913 assert_ok!(TemplateModule::remove_from_white_list(1490 origin1.clone(),914 origin1.clone(),1491 1,915 collection_id,1492 2916 21493 ));917 ));1494 assert_eq!(TemplateModule::white_list(1).len(), 0);918 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1495 });919 });1496}920}14979211498#[test]922#[test]1499fn admin_can_remove_address_from_white_list() {923fn admin_can_remove_address_from_white_list() {1500 new_test_ext().execute_with(|| {924 new_test_ext().execute_with(|| {1501 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();925 default_limits();1502 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();926 1503 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();927 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1504 let mode: CollectionMode = CollectionMode::NFT(2000);1505 let origin1 = Origin::signed(1);928 let origin1 = Origin::signed(1);1506 let origin2 = Origin::signed(2);929 let origin2 = Origin::signed(2);15079301508 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 931 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1509 collection_numbers_limit: 10,1510 account_token_ownership_limit: 10,1511 collections_admins_limit: 5,1512 custom_data_limit: 2048,1513 nft_sponsor_transfer_timeout: 15,1514 fungible_sponsor_transfer_timeout: 15,1515 refungible_sponsor_transfer_timeout: 15, 1516 }));15179321518 assert_ok!(TemplateModule::create_collection(933 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 3));1519 origin1.clone(),1520 col_name1.clone(),1521 col_desc1.clone(),1522 token_prefix1.clone(),1523 mode1524 ));15251526 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));15271528 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));1529 assert_ok!(TemplateModule::remove_from_white_list(934 assert_ok!(TemplateModule::remove_from_white_list(1530 origin2.clone(),935 origin2.clone(),1531 1,936 collection_id,1532 3937 31533 ));938 ));1534 assert_eq!(TemplateModule::white_list(1).len(), 0);939 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1535 });940 });1536}941}15379421538#[test]943#[test]1539fn nonprivileged_user_cannot_remove_address_from_white_list() {944fn nonprivileged_user_cannot_remove_address_from_white_list() {1540 new_test_ext().execute_with(|| {945 new_test_ext().execute_with(|| {1541 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();946 default_limits();1542 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();947 1543 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();948 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1544 let mode: CollectionMode = CollectionMode::NFT(2000);1545 let origin1 = Origin::signed(1);949 let origin1 = Origin::signed(1);1546 let origin2 = Origin::signed(2);950 let origin2 = Origin::signed(2);15479511548 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 952 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1549 collection_numbers_limit: 10,1550 account_token_ownership_limit: 10,1551 collections_admins_limit: 5,1552 custom_data_limit: 2048,1553 nft_sponsor_transfer_timeout: 15,1554 fungible_sponsor_transfer_timeout: 15,1555 refungible_sponsor_transfer_timeout: 15, 1556 }));15571558 assert_ok!(TemplateModule::create_collection(1559 origin1.clone(),1560 col_name1.clone(),1561 col_desc1.clone(),1562 token_prefix1.clone(),1563 mode1564 ));15651566 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1567 assert_noop!(953 assert_noop!(1568 TemplateModule::remove_from_white_list(origin2.clone(), 1, 2),954 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1569 "You do not have permissions to modify this collection"955 "You do not have permissions to modify this collection"1570 );956 );1571 assert_eq!(TemplateModule::white_list(1)[0], 2);957 assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1572 });958 });1573}959}15749601575#[test]961#[test]1576fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {962fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1577 new_test_ext().execute_with(|| {963 new_test_ext().execute_with(|| {964 default_limits();1578 let origin1 = Origin::signed(1);965 let origin1 = Origin::signed(1);15799661580 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1581 collection_numbers_limit: 10,1582 account_token_ownership_limit: 10,1583 collections_admins_limit: 5,1584 custom_data_limit: 2048,1585 nft_sponsor_transfer_timeout: 15,1586 fungible_sponsor_transfer_timeout: 15,1587 refungible_sponsor_transfer_timeout: 15, 1588 }));15891590 assert_noop!(967 assert_noop!(1591 TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),968 TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),1592 "This collection does not exist"969 "This collection does not exist"1597#[test]974#[test]1598fn nobody_can_remove_address_from_white_list_of_deleted_collection() {975fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1599 new_test_ext().execute_with(|| {976 new_test_ext().execute_with(|| {1600 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();977 default_limits();1601 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();978 1602 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();979 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1603 let mode: CollectionMode = CollectionMode::NFT(2000);1604 let origin1 = Origin::signed(1);980 let origin1 = Origin::signed(1);1605 let origin2 = Origin::signed(2);981 let origin2 = Origin::signed(2);16069821607 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 983 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1608 collection_numbers_limit: 10,1609 account_token_ownership_limit: 10,1610 collections_admins_limit: 5,1611 custom_data_limit: 2048,1612 nft_sponsor_transfer_timeout: 15,1613 fungible_sponsor_transfer_timeout: 15,1614 refungible_sponsor_transfer_timeout: 15, 1615 }));16161617 assert_ok!(TemplateModule::create_collection(1618 origin1.clone(),1619 col_name1.clone(),1620 col_desc1.clone(),1621 token_prefix1.clone(),1622 mode1623 ));16241625 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1626 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));984 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1627 assert_noop!(985 assert_noop!(1628 TemplateModule::remove_from_white_list(origin2.clone(), 1, 2),986 TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1629 "This collection does not exist"987 "This collection does not exist"1630 );988 );1631 assert_eq!(TemplateModule::white_list(1).len(), 0);989 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1632 });990 });1633}991}16349921635// If address is already removed from white list, nothing happens993// If address is already removed from white list, nothing happens1636#[test]994#[test]1637fn address_is_already_removed_from_white_list() {995fn address_is_already_removed_from_white_list() {1638 new_test_ext().execute_with(|| {996 new_test_ext().execute_with(|| {1639 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();997 default_limits();1640 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();998 1641 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();999 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1642 let mode: CollectionMode = CollectionMode::NFT(2000);1643 let origin1 = Origin::signed(1);1000 let origin1 = Origin::signed(1);164410011645 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1002 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1646 collection_numbers_limit: 10,1647 account_token_ownership_limit: 10,1648 collections_admins_limit: 5,1649 custom_data_limit: 2048,1650 nft_sponsor_transfer_timeout: 15,1651 fungible_sponsor_transfer_timeout: 15,1652 refungible_sponsor_transfer_timeout: 15, 1653 }));16541655 assert_ok!(TemplateModule::create_collection(1656 origin1.clone(),1657 col_name1.clone(),1658 col_desc1.clone(),1659 token_prefix1.clone(),1660 mode1661 ));16621663 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1664 assert_ok!(TemplateModule::remove_from_white_list(1003 assert_ok!(TemplateModule::remove_from_white_list(1665 origin1.clone(),1004 origin1.clone(),1666 1,1005 collection_id,1667 21006 21668 ));1007 ));1669 assert_ok!(TemplateModule::remove_from_white_list(1008 assert_ok!(TemplateModule::remove_from_white_list(1670 origin1.clone(),1009 origin1.clone(),1671 1,1010 collection_id,1672 21011 21673 ));1012 ));1674 assert_eq!(TemplateModule::white_list(1).len(), 0);1013 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1675 });1014 });1676}1015}167710161678// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1017// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1679#[test]1018#[test]1680fn white_list_test_1() {1019fn white_list_test_1() {1681 new_test_ext().execute_with(|| {1020 new_test_ext().execute_with(|| {1682 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1021 default_limits();1683 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1022 1684 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1023 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1685 let mode: CollectionMode = CollectionMode::NFT(2000);168610241687 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1688 collection_numbers_limit: 10,1689 account_token_ownership_limit: 10,1690 collections_admins_limit: 5,1691 custom_data_limit: 2048,1692 nft_sponsor_transfer_timeout: 15,1693 fungible_sponsor_transfer_timeout: 15,1694 refungible_sponsor_transfer_timeout: 15, 1695 }));16961697 let origin1 = Origin::signed(1);1025 let origin1 = Origin::signed(1);1698 assert_ok!(TemplateModule::create_collection(1026 1699 origin1.clone(),1027 let data = default_nft_data();1700 col_name1.clone(),1028 create_test_item(collection_id, &data.into());1701 col_desc1.clone(),1702 token_prefix1.clone(),1703 mode1704 ));1705 assert_eq!(TemplateModule::collection(1).owner, 1);170610291707 assert_ok!(TemplateModule::create_item(1708 origin1.clone(),1709 1,1710 [1, 2, 3].to_vec(),1711 11712 ));17131714 assert_ok!(TemplateModule::set_public_access_mode(1030 assert_ok!(TemplateModule::set_public_access_mode(1715 origin1.clone(),1031 origin1.clone(),1716 1,1032 collection_id,1717 AccessMode::WhiteList1033 AccessMode::WhiteList1718 ));1034 ));1719 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1035 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));172010361721 assert_noop!(1037 assert_noop!(1722 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1038 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1728#[test]1044#[test]1729fn white_list_test_2() {1045fn white_list_test_2() {1730 new_test_ext().execute_with(|| {1046 new_test_ext().execute_with(|| {1731 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1047 default_limits();1732 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1048 1733 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1049 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1734 let mode: CollectionMode = CollectionMode::NFT(2000);17351736 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: 2048,1741 nft_sponsor_transfer_timeout: 15,1742 fungible_sponsor_transfer_timeout: 15,1743 refungible_sponsor_transfer_timeout: 15, 1744 }));17451746 let origin1 = Origin::signed(1);1050 let origin1 = Origin::signed(1);1747 assert_ok!(TemplateModule::create_collection(1051 1748 origin1.clone(),1052 let data = default_nft_data();1749 col_name1.clone(),1053 create_test_item(collection_id, &data.into());1750 col_desc1.clone(),1751 token_prefix1.clone(),1752 mode1753 ));1754 assert_eq!(TemplateModule::collection(1).owner, 1);175510541756 assert_ok!(TemplateModule::create_item(1757 origin1.clone(),1758 1,1759 [1, 2, 3].to_vec(),1760 11761 ));17621763 assert_ok!(TemplateModule::set_public_access_mode(1055 assert_ok!(TemplateModule::set_public_access_mode(1764 origin1.clone(),1056 origin1.clone(),1765 1,1057 collection_id,1766 AccessMode::WhiteList1058 AccessMode::WhiteList1767 ));1059 ));1768 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1060 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1789#[test]1081#[test]1790fn white_list_test_3() {1082fn white_list_test_3() {1791 new_test_ext().execute_with(|| {1083 new_test_ext().execute_with(|| {1792 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1084 default_limits();1793 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1085 1794 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1086 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1795 let mode: CollectionMode = CollectionMode::NFT(2000);179610871797 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1798 collection_numbers_limit: 10,1799 account_token_ownership_limit: 10,1800 collections_admins_limit: 5,1801 custom_data_limit: 2048,1802 nft_sponsor_transfer_timeout: 15,1803 fungible_sponsor_transfer_timeout: 15,1804 refungible_sponsor_transfer_timeout: 15, 1805 }));18061807 let origin1 = Origin::signed(1);1088 let origin1 = Origin::signed(1);1808 assert_ok!(TemplateModule::create_collection(1089 1809 origin1.clone(),1090 let data = default_nft_data();1810 col_name1.clone(),1091 create_test_item(collection_id, &data.into());1811 col_desc1.clone(),1812 token_prefix1.clone(),1813 mode1814 ));1815 assert_eq!(TemplateModule::collection(1).owner, 1);181610921817 assert_ok!(TemplateModule::create_item(1818 origin1.clone(),1819 1,1820 [1, 2, 3].to_vec(),1821 11822 ));18231824 assert_ok!(TemplateModule::set_public_access_mode(1093 assert_ok!(TemplateModule::set_public_access_mode(1825 origin1.clone(),1094 origin1.clone(),1826 1,1095 collection_id,1827 AccessMode::WhiteList1096 AccessMode::WhiteList1828 ));1097 ));1829 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1098 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1838#[test]1107#[test]1839fn white_list_test_4() {1108fn white_list_test_4() {1840 new_test_ext().execute_with(|| {1109 new_test_ext().execute_with(|| {1841 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1110 default_limits();1842 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1111 1843 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1112 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1844 let mode: CollectionMode = CollectionMode::NFT(2000);184511131846 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1847 collection_numbers_limit: 10,1848 account_token_ownership_limit: 10,1849 collections_admins_limit: 5,1850 custom_data_limit: 2048,1851 nft_sponsor_transfer_timeout: 15,1852 fungible_sponsor_transfer_timeout: 15,1853 refungible_sponsor_transfer_timeout: 15, 1854 }));18551856 let origin1 = Origin::signed(1);1114 let origin1 = Origin::signed(1);1857 assert_ok!(TemplateModule::create_collection(1858 origin1.clone(),1859 col_name1.clone(),1860 col_desc1.clone(),1861 token_prefix1.clone(),1862 mode1863 ));1864 assert_eq!(TemplateModule::collection(1).owner, 1);186511151866 assert_ok!(TemplateModule::create_item(1116 let data = default_nft_data();1867 origin1.clone(),1868 1,1117 create_test_item(collection_id, &data.into());1869 [1, 2, 3].to_vec(),1870 11871 ));187211181873 assert_ok!(TemplateModule::set_public_access_mode(1119 assert_ok!(TemplateModule::set_public_access_mode(1874 origin1.clone(),1120 origin1.clone(),1875 1,1121 collection_id,1876 AccessMode::WhiteList1122 AccessMode::WhiteList1877 ));1123 ));1878 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1124 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1879 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1125 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));188011261881 // do approve1127 // do approve1882 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1128 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1883 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);1129 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);188411301885 assert_ok!(TemplateModule::remove_from_white_list(1131 assert_ok!(TemplateModule::remove_from_white_list(1886 origin1.clone(),1132 origin1.clone(),1887 1,1133 collection_id,1888 21134 21889 ));1135 ));189011361899#[test]1145#[test]1900fn white_list_test_5() {1146fn white_list_test_5() {1901 new_test_ext().execute_with(|| {1147 new_test_ext().execute_with(|| {1902 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1148 default_limits();1903 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1149 1904 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1150 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1905 let mode: CollectionMode = CollectionMode::NFT(2000);190611511907 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1908 collection_numbers_limit: 10,1909 account_token_ownership_limit: 10,1910 collections_admins_limit: 5,1911 custom_data_limit: 2048,1912 nft_sponsor_transfer_timeout: 15,1913 fungible_sponsor_transfer_timeout: 15,1914 refungible_sponsor_transfer_timeout: 15, 1915 }));19161917 let origin1 = Origin::signed(1);1152 let origin1 = Origin::signed(1);1918 assert_ok!(TemplateModule::create_collection(1919 origin1.clone(),1920 col_name1.clone(),1921 col_desc1.clone(),1922 token_prefix1.clone(),1923 mode1924 ));1925 assert_eq!(TemplateModule::collection(1).owner, 1);192611531927 assert_ok!(TemplateModule::create_item(1154 let data = default_nft_data();1928 origin1.clone(),1929 1,1155 create_test_item(collection_id, &data.into());1930 [1, 2, 3].to_vec(),1931 11932 ));193311561934 assert_ok!(TemplateModule::set_public_access_mode(1157 assert_ok!(TemplateModule::set_public_access_mode(1935 origin1.clone(),1158 origin1.clone(),1936 1,1159 collection_id,1937 AccessMode::WhiteList1160 AccessMode::WhiteList1938 ));1161 ));1939 assert_noop!(1162 assert_noop!(1947#[test]1170#[test]1948fn white_list_test_6() {1171fn white_list_test_6() {1949 new_test_ext().execute_with(|| {1172 new_test_ext().execute_with(|| {1950 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1173 default_limits();1951 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1174 1952 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1175 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1953 let mode: CollectionMode = CollectionMode::NFT(2000);195411761955 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1956 collection_numbers_limit: 10,1957 account_token_ownership_limit: 10,1958 collections_admins_limit: 5,1959 custom_data_limit: 2048,1960 nft_sponsor_transfer_timeout: 15,1961 fungible_sponsor_transfer_timeout: 15,1962 refungible_sponsor_transfer_timeout: 15, 1963 }));19641965 let origin1 = Origin::signed(1);1177 let origin1 = Origin::signed(1);1966 assert_ok!(TemplateModule::create_collection(1967 origin1.clone(),1968 col_name1.clone(),1969 col_desc1.clone(),1970 token_prefix1.clone(),1971 mode1972 ));1973 assert_ok!(TemplateModule::set_public_access_mode(1178 assert_ok!(TemplateModule::set_public_access_mode(1974 origin1.clone(),1179 origin1.clone(),1975 1,1180 collection_id,1976 AccessMode::WhiteList1181 AccessMode::WhiteList1977 ));1182 ));197811831989#[test]1194#[test]1990fn white_list_test_7() {1195fn white_list_test_7() {1991 new_test_ext().execute_with(|| {1196 new_test_ext().execute_with(|| {1992 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1197 default_limits();1993 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1198 1994 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1199 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1995 let mode: CollectionMode = CollectionMode::NFT(2000);199612001997 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1201 let data = default_nft_data();1998 collection_numbers_limit: 10,1202 create_test_item(collection_id, &data.into());1999 account_token_ownership_limit: 10,2000 collections_admins_limit: 5,1203 2001 custom_data_limit: 2048,2002 nft_sponsor_transfer_timeout: 15,2003 fungible_sponsor_transfer_timeout: 15,2004 refungible_sponsor_transfer_timeout: 15, 2005 }));20062007 let origin1 = Origin::signed(1);1204 let origin1 = Origin::signed(1);2008 assert_ok!(TemplateModule::create_collection(2009 origin1.clone(),2010 col_name1.clone(),2011 col_desc1.clone(),2012 token_prefix1.clone(),2013 mode2014 ));2015 assert_eq!(TemplateModule::collection(1).owner, 1);201612052017 assert_ok!(TemplateModule::create_item(2018 origin1.clone(),2019 1,2020 [1, 2, 3].to_vec(),2021 12022 ));20232024 assert_ok!(TemplateModule::set_public_access_mode(1206 assert_ok!(TemplateModule::set_public_access_mode(2025 origin1.clone(),1207 origin1.clone(),2026 1,1208 collection_id,2027 AccessMode::WhiteList1209 AccessMode::WhiteList2028 ));1210 ));2029 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1211 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));2030 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1212 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));203112132032 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1214 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));2033 });1215 });2036#[test]1218#[test]2037fn white_list_test_8() {1219fn white_list_test_8() {2038 new_test_ext().execute_with(|| {1220 new_test_ext().execute_with(|| {2039 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1221 default_limits();2040 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1222 2041 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1223 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2042 let mode: CollectionMode = CollectionMode::NFT(2000);204312242044 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1225 let data = default_nft_data();2045 collection_numbers_limit: 10,1226 create_test_item(collection_id, &data.into());2046 account_token_ownership_limit: 10,2047 collections_admins_limit: 5,1227 2048 custom_data_limit: 2048,2049 nft_sponsor_transfer_timeout: 15,2050 fungible_sponsor_transfer_timeout: 15,2051 refungible_sponsor_transfer_timeout: 15, 2052 }));20532054 let origin1 = Origin::signed(1);1228 let origin1 = Origin::signed(1);2055 assert_ok!(TemplateModule::create_collection(2056 origin1.clone(),2057 col_name1.clone(),2058 col_desc1.clone(),2059 token_prefix1.clone(),2060 mode2061 ));2062 assert_eq!(TemplateModule::collection(1).owner, 1);206312292064 assert_ok!(TemplateModule::create_item(2065 origin1.clone(),2066 1,2067 [1, 2, 3].to_vec(),2068 12069 ));20702071 assert_ok!(TemplateModule::set_public_access_mode(1230 assert_ok!(TemplateModule::set_public_access_mode(2072 origin1.clone(),1231 origin1.clone(),2073 1,1232 collection_id,2074 AccessMode::WhiteList1233 AccessMode::WhiteList2075 ));1234 ));2076 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1235 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));2077 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1236 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));207812372079 // do approve1238 // do approve2080 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1239 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));2095#[test]1254#[test]2096fn white_list_test_9() {1255fn white_list_test_9() {2097 new_test_ext().execute_with(|| {1256 new_test_ext().execute_with(|| {2098 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1257 default_limits();2099 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1258 2100 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1259 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2101 let mode: CollectionMode = CollectionMode::NFT(2000);21022103 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2104 collection_numbers_limit: 10,2105 account_token_ownership_limit: 10,2106 collections_admins_limit: 5,2107 custom_data_limit: 2048,2108 nft_sponsor_transfer_timeout: 15,2109 fungible_sponsor_transfer_timeout: 15,2110 refungible_sponsor_transfer_timeout: 15, 2111 }));21122113 let origin1 = Origin::signed(1);1260 let origin1 = Origin::signed(1);2114 assert_ok!(TemplateModule::create_collection(2115 origin1.clone(),2116 col_name1.clone(),2117 col_desc1.clone(),2118 token_prefix1.clone(),2119 mode2120 ));212112612122 assert_ok!(TemplateModule::set_public_access_mode(1262 assert_ok!(TemplateModule::set_public_access_mode(2123 origin1.clone(),1263 origin1.clone(),2124 1,1264 collection_id,2125 AccessMode::WhiteList1265 AccessMode::WhiteList2126 ));1266 ));2127 assert_ok!(TemplateModule::set_mint_permission(1267 assert_ok!(TemplateModule::set_mint_permission(2128 origin1.clone(),1268 origin1.clone(),2129 1,1269 collection_id,2130 false1270 false2131 ));1271 ));213212722133 assert_ok!(TemplateModule::create_item(1273 let data = default_nft_data();2134 origin1.clone(),2135 1,1274 create_test_item(collection_id, &data.into());2136 [1, 2, 3].to_vec(),2137 12138 ));2139 });1275 });2140}1276}214112772142// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1278// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.2143#[test]1279#[test]2144fn white_list_test_10() {1280fn white_list_test_10() {2145 new_test_ext().execute_with(|| {1281 new_test_ext().execute_with(|| {2146 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1282 default_limits();2147 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1283 2148 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1284 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2149 let mode: CollectionMode = CollectionMode::NFT(2000);215012852151 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2152 collection_numbers_limit: 10,2153 account_token_ownership_limit: 10,2154 collections_admins_limit: 5,2155 custom_data_limit: 2048,2156 nft_sponsor_transfer_timeout: 15,2157 fungible_sponsor_transfer_timeout: 15,2158 refungible_sponsor_transfer_timeout: 15, 2159 }));21602161 let origin1 = Origin::signed(1);1286 let origin1 = Origin::signed(1);2162 let origin2 = Origin::signed(2);1287 let origin2 = Origin::signed(2);2163 assert_ok!(TemplateModule::create_collection(2164 origin1.clone(),2165 col_name1.clone(),2166 col_desc1.clone(),2167 token_prefix1.clone(),2168 mode2169 ));217012882171 assert_ok!(TemplateModule::set_public_access_mode(1289 assert_ok!(TemplateModule::set_public_access_mode(2172 origin1.clone(),1290 origin1.clone(),2173 1,1291 collection_id,2174 AccessMode::WhiteList1292 AccessMode::WhiteList2175 ));1293 ));2176 assert_ok!(TemplateModule::set_mint_permission(1294 assert_ok!(TemplateModule::set_mint_permission(2177 origin1.clone(),1295 origin1.clone(),2178 1,1296 collection_id,2179 false1297 false2180 ));1298 ));218112992182 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1300 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));218313012184 assert_ok!(TemplateModule::create_item(1302 assert_ok!(TemplateModule::create_item(2185 origin2.clone(),1303 origin2.clone(),2186 1,1304 collection_id,2187 [1, 2, 3].to_vec(),1305 2,2188 21306 default_nft_data().into()2189 ));1307 ));2190 });1308 });2191}1309}2194#[test]1312#[test]2195fn white_list_test_11() {1313fn white_list_test_11() {2196 new_test_ext().execute_with(|| {1314 new_test_ext().execute_with(|| {2197 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1315 default_limits();2198 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1316 2199 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1317 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2200 let mode: CollectionMode = CollectionMode::NFT(2000);220113182202 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2203 collection_numbers_limit: 10,2204 account_token_ownership_limit: 10,2205 collections_admins_limit: 5,2206 custom_data_limit: 2048,2207 nft_sponsor_transfer_timeout: 15,2208 fungible_sponsor_transfer_timeout: 15,2209 refungible_sponsor_transfer_timeout: 15, 2210 }));22112212 let origin1 = Origin::signed(1);1319 let origin1 = Origin::signed(1);2213 let origin2 = Origin::signed(2);1320 let origin2 = Origin::signed(2);2214 assert_ok!(TemplateModule::create_collection(2215 origin1.clone(),2216 col_name1.clone(),2217 col_desc1.clone(),2218 token_prefix1.clone(),2219 mode2220 ));222113212222 assert_ok!(TemplateModule::set_public_access_mode(1322 assert_ok!(TemplateModule::set_public_access_mode(2223 origin1.clone(),1323 origin1.clone(),2224 1,1324 collection_id,2225 AccessMode::WhiteList1325 AccessMode::WhiteList2226 ));1326 ));2227 assert_ok!(TemplateModule::set_mint_permission(1327 assert_ok!(TemplateModule::set_mint_permission(2228 origin1.clone(),1328 origin1.clone(),2229 1,1329 collection_id,2230 false1330 false2231 ));1331 ));2232 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1332 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));223313332234 assert_noop!(1334 assert_noop!(2235 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),1335 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),2236 "Public minting is not allowed for this collection"1336 "Public minting is not allowed for this collection."2237 );1337 );2238 });1338 });2239}1339}2242#[test]1342#[test]2243fn white_list_test_12() {1343fn white_list_test_12() {2244 new_test_ext().execute_with(|| {1344 new_test_ext().execute_with(|| {2245 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1345 default_limits();2246 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1346 2247 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1347 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2248 let mode: CollectionMode = CollectionMode::NFT(2000);224913482250 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2251 collection_numbers_limit: 10,2252 account_token_ownership_limit: 10,2253 collections_admins_limit: 5,2254 custom_data_limit: 2048,2255 nft_sponsor_transfer_timeout: 15,2256 fungible_sponsor_transfer_timeout: 15,2257 refungible_sponsor_transfer_timeout: 15, 2258 }));22592260 let origin1 = Origin::signed(1);1349 let origin1 = Origin::signed(1);2261 let origin2 = Origin::signed(2);1350 let origin2 = Origin::signed(2);2262 assert_ok!(TemplateModule::create_collection(2263 origin1.clone(),2264 col_name1.clone(),2265 col_desc1.clone(),2266 token_prefix1.clone(),2267 mode2268 ));226913512270 assert_ok!(TemplateModule::set_public_access_mode(1352 assert_ok!(TemplateModule::set_public_access_mode(2271 origin1.clone(),1353 origin1.clone(),2272 1,1354 collection_id,2273 AccessMode::WhiteList1355 AccessMode::WhiteList2274 ));1356 ));2275 assert_ok!(TemplateModule::set_mint_permission(1357 assert_ok!(TemplateModule::set_mint_permission(2276 origin1.clone(),1358 origin1.clone(),2277 1,1359 collection_id,2278 false1360 false2279 ));1361 ));228013622281 assert_noop!(1363 assert_noop!(2282 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),1364 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),2283 "Public minting is not allowed for this collection"1365 "Public minting is not allowed for this collection."2284 );1366 );2285 });1367 });2286}1368}2289#[test]1371#[test]2290fn white_list_test_13() {1372fn white_list_test_13() {2291 new_test_ext().execute_with(|| {1373 new_test_ext().execute_with(|| {2292 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1374 default_limits();2293 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1375 2294 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1376 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2295 let mode: CollectionMode = CollectionMode::NFT(2000);229613772297 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2298 collection_numbers_limit: 10,2299 account_token_ownership_limit: 10,2300 collections_admins_limit: 5,2301 custom_data_limit: 2048,2302 nft_sponsor_transfer_timeout: 15,2303 fungible_sponsor_transfer_timeout: 15,2304 refungible_sponsor_transfer_timeout: 15, 2305 }));23062307 let origin1 = Origin::signed(1);1378 let origin1 = Origin::signed(1);2308 assert_ok!(TemplateModule::create_collection(2309 origin1.clone(),2310 col_name1.clone(),2311 col_desc1.clone(),2312 token_prefix1.clone(),2313 mode2314 ));231513792316 assert_ok!(TemplateModule::set_public_access_mode(1380 assert_ok!(TemplateModule::set_public_access_mode(2317 origin1.clone(),1381 origin1.clone(),2318 1,1382 collection_id,2319 AccessMode::WhiteList1383 AccessMode::WhiteList2320 ));1384 ));2321 assert_ok!(TemplateModule::set_mint_permission(1385 assert_ok!(TemplateModule::set_mint_permission(2322 origin1.clone(),1386 origin1.clone(),2323 1,1387 collection_id,2324 true1388 true2325 ));1389 ));232613902327 assert_ok!(TemplateModule::create_item(1391 let data = default_nft_data();2328 origin1.clone(),2329 1,1392 create_test_item(collection_id, &data.into());2330 [1, 2, 3].to_vec(),2331 12332 ));2333 });1393 });2334}1394}233513952336// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1396// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.2337#[test]1397#[test]2338fn white_list_test_14() {1398fn white_list_test_14() {2339 new_test_ext().execute_with(|| {1399 new_test_ext().execute_with(|| {2340 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1400 default_limits();2341 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1401 2342 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1402 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2343 let mode: CollectionMode = CollectionMode::NFT(2000);234414032345 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2346 collection_numbers_limit: 10,2347 account_token_ownership_limit: 10,2348 collections_admins_limit: 5,2349 custom_data_limit: 2048,2350 nft_sponsor_transfer_timeout: 15,2351 fungible_sponsor_transfer_timeout: 15,2352 refungible_sponsor_transfer_timeout: 15, 2353 }));23542355 let origin1 = Origin::signed(1);1404 let origin1 = Origin::signed(1);2356 let origin2 = Origin::signed(2);1405 let origin2 = Origin::signed(2);2357 assert_ok!(TemplateModule::create_collection(2358 origin1.clone(),2359 col_name1.clone(),2360 col_desc1.clone(),2361 token_prefix1.clone(),2362 mode2363 ));236414062365 assert_ok!(TemplateModule::set_public_access_mode(1407 assert_ok!(TemplateModule::set_public_access_mode(2366 origin1.clone(),1408 origin1.clone(),2367 1,1409 collection_id,2368 AccessMode::WhiteList1410 AccessMode::WhiteList2369 ));1411 ));2370 assert_ok!(TemplateModule::set_mint_permission(1412 assert_ok!(TemplateModule::set_mint_permission(2371 origin1.clone(),1413 origin1.clone(),2372 1,1414 collection_id,2373 true1415 true2374 ));1416 ));237514172376 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1418 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));237714192378 assert_ok!(TemplateModule::create_item(1420 assert_ok!(TemplateModule::create_item(2379 origin2.clone(),1421 origin2.clone(),2380 1,1422 1,2381 [1, 2, 3].to_vec(),1423 2,2382 21424 default_nft_data().into()2383 ));1425 ));2384 });1426 });2385}1427}2388#[test]1430#[test]2389fn white_list_test_15() {1431fn white_list_test_15() {2390 new_test_ext().execute_with(|| {1432 new_test_ext().execute_with(|| {2391 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1433 default_limits();2392 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1434 2393 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1435 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2394 let mode: CollectionMode = CollectionMode::NFT(2000);239514362396 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2397 collection_numbers_limit: 10,2398 account_token_ownership_limit: 10,2399 collections_admins_limit: 5,2400 custom_data_limit: 2048,2401 nft_sponsor_transfer_timeout: 15,2402 fungible_sponsor_transfer_timeout: 15,2403 refungible_sponsor_transfer_timeout: 15, 2404 }));24052406 let origin1 = Origin::signed(1);1437 let origin1 = Origin::signed(1);2407 let origin2 = Origin::signed(2);1438 let origin2 = Origin::signed(2);2408 assert_ok!(TemplateModule::create_collection(2409 origin1.clone(),2410 col_name1.clone(),2411 col_desc1.clone(),2412 token_prefix1.clone(),2413 mode2414 ));241514392416 assert_ok!(TemplateModule::set_public_access_mode(1440 assert_ok!(TemplateModule::set_public_access_mode(2417 origin1.clone(),1441 origin1.clone(),2418 1,1442 collection_id,2419 AccessMode::WhiteList1443 AccessMode::WhiteList2420 ));1444 ));2421 assert_ok!(TemplateModule::set_mint_permission(1445 assert_ok!(TemplateModule::set_mint_permission(2422 origin1.clone(),1446 origin1.clone(),2423 1,1447 collection_id,2424 true1448 true2425 ));1449 ));242614502427 assert_noop!(1451 assert_noop!(2428 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),1452 TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),2429 "Address is not in white list"1453 "Address is not in white list"2430 );1454 );2431 });1455 });2435#[test]1459#[test]2436fn white_list_test_16() {1460fn white_list_test_16() {2437 new_test_ext().execute_with(|| {1461 new_test_ext().execute_with(|| {2438 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1462 default_limits();2439 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1463 2440 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1464 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2441 let mode: CollectionMode = CollectionMode::NFT(2000);244214652443 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2444 collection_numbers_limit: 10,2445 account_token_ownership_limit: 10,2446 collections_admins_limit: 5,2447 custom_data_limit: 2048,2448 nft_sponsor_transfer_timeout: 15,2449 fungible_sponsor_transfer_timeout: 15,2450 refungible_sponsor_transfer_timeout: 15, 2451 }));24522453 let origin1 = Origin::signed(1);1466 let origin1 = Origin::signed(1);2454 let origin2 = Origin::signed(2);1467 let origin2 = Origin::signed(2);2455 assert_ok!(TemplateModule::create_collection(2456 origin1.clone(),2457 col_name1.clone(),2458 col_desc1.clone(),2459 token_prefix1.clone(),2460 mode2461 ));246214682463 assert_ok!(TemplateModule::set_public_access_mode(1469 assert_ok!(TemplateModule::set_public_access_mode(2464 origin1.clone(),1470 origin1.clone(),2465 1,1471 collection_id,2466 AccessMode::WhiteList1472 AccessMode::WhiteList2467 ));1473 ));2468 assert_ok!(TemplateModule::set_mint_permission(1474 assert_ok!(TemplateModule::set_mint_permission(2469 origin1.clone(),1475 origin1.clone(),2470 1,1476 collection_id,2471 true1477 true2472 ));1478 ));2473 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1479 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));247414802475 assert_ok!(TemplateModule::create_item(1481 assert_ok!(TemplateModule::create_item(2476 origin2.clone(),1482 origin2.clone(),2477 1,1483 1,2478 [1, 2, 3].to_vec(),1484 2,2479 21485 default_nft_data().into()2480 ));1486 ));2481 });1487 });2482}1488}2485#[test]1491#[test]2486fn total_number_collections_bound() {1492fn total_number_collections_bound() {2487 new_test_ext().execute_with(|| {1493 new_test_ext().execute_with(|| {2488 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1494 default_limits();2489 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1495 2490 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1496 create_test_collection(&CollectionMode::NFT, 1);2491 let mode: CollectionMode = CollectionMode::NFT(2000);24922493 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2494 collection_numbers_limit: 10,2495 account_token_ownership_limit: 10,2496 collections_admins_limit: 5,2497 custom_data_limit: 2048,2498 nft_sponsor_transfer_timeout: 15,2499 fungible_sponsor_transfer_timeout: 15,2500 refungible_sponsor_transfer_timeout: 15, 2501 }));25022503 let origin1 = Origin::signed(1);2504 assert_ok!(TemplateModule::create_collection(2505 origin1.clone(),2506 col_name1.clone(),2507 col_desc1.clone(),2508 token_prefix1.clone(),2509 mode2510 ));2511 });1497 });2512}1498}251314992514// Total number of collections. Negotive test1500// Total number of collections. Negotive test2515#[test]1501#[test]2516fn total_number_collections_bound_neg() {1502fn total_number_collections_bound_neg() {2517 new_test_ext().execute_with(|| {1503 new_test_ext().execute_with(|| {2518 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1504 default_limits();2519 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2520 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2521 let mode: CollectionMode = CollectionMode::NFT(2000);252215052523 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2524 collection_numbers_limit: 10,2525 account_token_ownership_limit: 10,2526 collections_admins_limit: 5,2527 custom_data_limit: 2048,2528 nft_sponsor_transfer_timeout: 15,2529 fungible_sponsor_transfer_timeout: 15,2530 refungible_sponsor_transfer_timeout: 15, 2531 }));25322533 let origin1 = Origin::signed(1);1506 let origin1 = Origin::signed(1);253415072535 for _ in 0..10 {1508 for i in 0..default_collection_numbers_limit() {25362537 assert_ok!(TemplateModule::create_collection(1509 create_test_collection(&CollectionMode::NFT, i + 1);2538 origin1.clone(),2539 col_name1.clone(),2540 col_desc1.clone(),2541 token_prefix1.clone(),2542 mode.clone()2543 ));2544 }1510 }254515111512 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1513 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1514 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();15152546 // 11-th collection in chain. Expects error1516 // 11-th collection in chain. Expects error2547 assert_noop!(TemplateModule::create_collection(1517 assert_noop!(TemplateModule::create_collection(2548 origin1.clone(),1518 origin1.clone(),2549 col_name1.clone(),1519 col_name1.clone(),2550 col_desc1.clone(),1520 col_desc1.clone(),2551 token_prefix1.clone(),1521 token_prefix1.clone(),2552 mode.clone()1522 CollectionMode::NFT2553 ), "Total collections bound exceeded");1523 ), "Total collections bound exceeded");2554 });1524 });2555}1525}2558#[test]1528#[test]2559fn owned_tokens_bound() {1529fn owned_tokens_bound() {2560 new_test_ext().execute_with(|| {1530 new_test_ext().execute_with(|| {2561 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1531 default_limits();2562 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1532 2563 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1533 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2564 let mode: CollectionMode = CollectionMode::NFT(2000);256515342566 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1535 let data = default_nft_data();2567 collection_numbers_limit: 10,2568 account_token_ownership_limit: 10,2569 collections_admins_limit: 5,2570 custom_data_limit: 2048,2571 nft_sponsor_transfer_timeout: 15,2572 fungible_sponsor_transfer_timeout: 15,2573 refungible_sponsor_transfer_timeout: 15, 2574 }));25752576 let origin1 = Origin::signed(1);2577 assert_ok!(TemplateModule::create_collection(1536 create_test_item(collection_id, &data.clone().into());2578 origin1.clone(),2579 col_name1.clone(),2580 col_desc1.clone(),2581 token_prefix1.clone(),2582 mode2583 ));25842585 assert_ok!(TemplateModule::create_item(1537 create_test_item(collection_id, &data.into());2586 origin1.clone(),2587 1,2588 [1, 2, 3].to_vec(),2589 12590 ));25912592 assert_ok!(TemplateModule::create_item(2593 origin1.clone(),2594 1,2595 [1, 2, 3].to_vec(),2596 12597 ));2598 });1538 });2599}1539}260015402601// Owned tokens by a single address. Negotive test1541// Owned tokens by a single address. Negotive test2602#[test]1542#[test]2603fn owned_tokens_bound_neg() {1543fn owned_tokens_bound_neg() {2604 new_test_ext().execute_with(|| {1544 new_test_ext().execute_with(|| {2605 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2606 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2607 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2608 let mode: CollectionMode = CollectionMode::NFT(2000);26092610 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1545 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2611 collection_numbers_limit: 10,1546 collection_numbers_limit: 10,2612 account_token_ownership_limit: 1,1547 account_token_ownership_limit: 1,2616 fungible_sponsor_transfer_timeout: 15,1551 fungible_sponsor_transfer_timeout: 15,2617 refungible_sponsor_transfer_timeout: 15, 1552 refungible_sponsor_transfer_timeout: 15, 2618 }));1553 }));1554 1555 let collection_id = create_test_collection(&CollectionMode::NFT, 1);261915562620 let origin1 = Origin::signed(1);1557 let origin1 = Origin::signed(1);2621 assert_ok!(TemplateModule::create_collection(1558 let data = default_nft_data();2622 origin1.clone(),2623 col_name1.clone(),1559 create_test_item(collection_id, &data.clone().into());2624 col_desc1.clone(),2625 token_prefix1.clone(),2626 mode2627 ));262815602629 assert_ok!(TemplateModule::create_item(2630 origin1.clone(),2631 1,2632 [1, 2, 3].to_vec(),2633 12634 ));26352636 assert_noop!(TemplateModule::create_item(1561 assert_noop!(TemplateModule::create_item(2637 origin1.clone(),1562 origin1.clone(),2638 1,1563 1,2639 [1, 2, 3].to_vec(),1564 1,2640 11565 data.into()2641 ), "Owned tokens by a single address bound exceeded");1566 ), "Owned tokens by a single address bound exceeded");2642 });1567 });2643}1568}2646#[test]1571#[test]2647fn collection_admins_bound() {1572fn collection_admins_bound() {2648 new_test_ext().execute_with(|| {1573 new_test_ext().execute_with(|| {2649 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2650 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2651 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2652 let mode: CollectionMode = CollectionMode::NFT(2000);26532654 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1574 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2655 collection_numbers_limit: 10,1575 collection_numbers_limit: 10,2656 account_token_ownership_limit: 10,1576 account_token_ownership_limit: 10,2660 fungible_sponsor_transfer_timeout: 15,1580 fungible_sponsor_transfer_timeout: 15,2661 refungible_sponsor_transfer_timeout: 15, 1581 refungible_sponsor_transfer_timeout: 15, 2662 }));1582 }));1583 1584 let collection_id = create_test_collection(&CollectionMode::NFT, 1);266315852664 let origin1 = Origin::signed(1);1586 let origin1 = Origin::signed(1);2665 assert_ok!(TemplateModule::create_collection(1587 2666 origin1.clone(),2667 col_name1.clone(),2668 col_desc1.clone(),2669 token_prefix1.clone(),2670 mode2671 ));26722673 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1588 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));2674 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));1589 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3));2675 });1590 });2676}1591}267715922678// Number of collection admins. Negotive test1593// Number of collection admins. Negotive test2679#[test]1594#[test]2680fn collection_admins_bound_neg() {1595fn collection_admins_bound_neg() {2681 new_test_ext().execute_with(|| {1596 new_test_ext().execute_with(|| {2682 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2683 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2684 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2685 let mode: CollectionMode = CollectionMode::NFT(2000);26862687 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1597 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2688 collection_numbers_limit: 10,1598 collection_numbers_limit: 10,2689 account_token_ownership_limit: 1,1599 account_token_ownership_limit: 1,2693 fungible_sponsor_transfer_timeout: 15,1603 fungible_sponsor_transfer_timeout: 15,2694 refungible_sponsor_transfer_timeout: 15, 1604 refungible_sponsor_transfer_timeout: 15, 2695 }));1605 }));1606 1607 let collection_id = create_test_collection(&CollectionMode::NFT, 1);269616082697 let origin1 = Origin::signed(1);1609 let origin1 = Origin::signed(1);2698 assert_ok!(TemplateModule::create_collection(2699 origin1.clone(),2700 col_name1.clone(),2701 col_desc1.clone(),2702 token_prefix1.clone(),2703 mode2704 ));270516102706 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1611 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));2707 assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3), "Number of collection admins bound exceeded");1612 assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3), "Number of collection admins bound exceeded");2708 });1613 });2709}1614}271016152711// Custom data size. Positive test1616// NFT custom data size. Negative test const_data.2712#[test]1617#[test]2713fn custom_data_size_bound() {1618fn custom_data_size_nft_const_data_bound_neg() {2714 new_test_ext().execute_with(|| {1619 new_test_ext().execute_with(|| {2715 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1620 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1621 collection_numbers_limit: 10,1622 account_token_ownership_limit: 10,1623 collections_admins_limit: 5,2716 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1624 custom_data_limit: 2,1625 nft_sponsor_transfer_timeout: 15,1626 fungible_sponsor_transfer_timeout: 15,2717 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1627 refungible_sponsor_transfer_timeout: 15, 1628 }));2718 let mode: CollectionMode = CollectionMode::NFT(2000);1629 1630 let collection_id = create_test_collection(&CollectionMode::NFT, 1);271916311632 let origin1 = Origin::signed(1);1633 let too_big_const_data = CreateItemData::NFT(CreateNftData{1634 const_data: vec![1, 2, 3, 4],1635 variable_data: vec![]1636 });16371638 assert_noop!(TemplateModule::create_item(1639 origin1.clone(),1640 collection_id,1641 1,1642 too_big_const_data1643 ), "const_data exceeded data limit.");1644 });1645}16461647// NFT custom data size. Negative test variable_data.1648#[test]1649fn custom_data_size_nft_variable_data_bound_neg() {1650 new_test_ext().execute_with(|| {2720 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1651 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2721 collection_numbers_limit: 10,1652 collection_numbers_limit: 10,2722 account_token_ownership_limit: 10,1653 account_token_ownership_limit: 10,2723 collections_admins_limit: 5,1654 collections_admins_limit: 5,2724 custom_data_limit: 2048,1655 custom_data_limit: 2,2725 nft_sponsor_transfer_timeout: 15,1656 nft_sponsor_transfer_timeout: 15,2726 fungible_sponsor_transfer_timeout: 15,1657 fungible_sponsor_transfer_timeout: 15,2727 refungible_sponsor_transfer_timeout: 15, 1658 refungible_sponsor_transfer_timeout: 15, 2728 }));1659 }));272916601661 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16622730 let origin1 = Origin::signed(1);1663 let origin1 = Origin::signed(1);2731 assert_ok!(TemplateModule::create_collection(1664 let too_big_const_data = CreateItemData::NFT(CreateNftData{1665 const_data: vec![],1666 variable_data: vec![1, 2, 3, 4]1667 });16681669 assert_noop!(TemplateModule::create_item(2732 origin1.clone(),1670 origin1.clone(),2733 col_name1.clone(),1671 collection_id,2734 col_desc1.clone(),1672 1,2735 token_prefix1.clone(),1673 too_big_const_data2736 mode1674 ), "variable_data exceeded data limit.");2737 ));2738 });1675 });2739}1676}274016772741// Custom data size. Negotive test1678// Re fungible custom data size. Negative test const_data.2742#[test]1679#[test]2743fn custom_data_size_bound_neg() {1680fn custom_data_size_re_fungible_const_data_bound_neg() {2744 new_test_ext().execute_with(|| {1681 new_test_ext().execute_with(|| {2745 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1682 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2746 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1683 collection_numbers_limit: 10,1684 account_token_ownership_limit: 10,1685 collections_admins_limit: 5,2747 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1686 custom_data_limit: 2,1687 nft_sponsor_transfer_timeout: 15,2748 let mode: CollectionMode = CollectionMode::NFT(2000);1688 fungible_sponsor_transfer_timeout: 15,1689 refungible_sponsor_transfer_timeout: 15, 1690 }));274916911692 let collection_id = create_test_collection(&CollectionMode::NFT, 1);16931694 let origin1 = Origin::signed(1);1695 let too_big_const_data = CreateItemData::NFT(CreateNftData{1696 const_data: vec![1, 2, 3, 4],1697 variable_data: vec![]1698 });16991700 assert_noop!(TemplateModule::create_item(1701 origin1.clone(),1702 collection_id,1703 1,1704 too_big_const_data1705 ), "const_data exceeded data limit.");1706 });1707}17081709// Re fungible custom data size. Negative test variable_data.1710#[test]1711fn custom_data_size_re_fungible_variable_data_bound_neg() {1712 new_test_ext().execute_with(|| {2750 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1713 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2751 collection_numbers_limit: 10,1714 collection_numbers_limit: 10,2752 account_token_ownership_limit: 10,1715 account_token_ownership_limit: 10,2753 collections_admins_limit: 5,1716 collections_admins_limit: 5,2754 custom_data_limit: 200,1717 custom_data_limit: 2,2755 nft_sponsor_transfer_timeout: 15,1718 nft_sponsor_transfer_timeout: 15,2756 fungible_sponsor_transfer_timeout: 15,1719 fungible_sponsor_transfer_timeout: 15,2757 refungible_sponsor_transfer_timeout: 15, 1720 refungible_sponsor_transfer_timeout: 15, 2758 }));1721 }));275917221723 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17242760 let origin1 = Origin::signed(1);1725 let origin1 = Origin::signed(1);2761 assert_noop!(TemplateModule::create_collection(1726 let too_big_const_data = CreateItemData::NFT(CreateNftData{1727 const_data: vec![],1728 variable_data: vec![1, 2, 3, 4]1729 });17301731 assert_noop!(TemplateModule::create_item(2762 origin1.clone(),1732 origin1.clone(),2763 col_name1.clone(),1733 collection_id,2764 col_desc1.clone(),1734 1,2765 token_prefix1.clone(),1735 too_big_const_data2766 mode1736 ), "variable_data exceeded data limit.");2767 ), "Custom data size bound exceeded");2768 });1737 });2769}1738}2770// #endregion1739// #endregion277117401741#[test]1742fn set_const_on_chain_schema() {1743 new_test_ext().execute_with(|| {1744 default_limits();17451746 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17471748 let origin1 = Origin::signed(1);1749 assert_ok!(TemplateModule::set_const_on_chain_schema(origin1, collection_id, b"test const on chain schema".to_vec()));17501751 assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"test const on chain schema".to_vec());1752 assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"".to_vec());1753 });1754}17551756#[test]1757fn set_variable_on_chain_schema() {1758 new_test_ext().execute_with(|| {1759 default_limits();1760 1761 let collection_id = create_test_collection(&CollectionMode::NFT, 1);17621763 let origin1 = Origin::signed(1);1764 assert_ok!(TemplateModule::set_variable_on_chain_schema(origin1, collection_id, b"test variable on chain schema".to_vec()));17651766 assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"".to_vec());1767 assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"test variable on chain schema".to_vec());1768 });1769}runtime/src/nft_weights.rsdiffbeforeafterboth--- a/runtime/src/nft_weights.rs
+++ b/runtime/src/nft_weights.rs
@@ -93,4 +93,19 @@
.saturating_add(DbWeight::get().reads(2 as Weight))
.saturating_add(DbWeight::get().writes(1 as Weight))
}
+ fn set_const_on_chain_schema() -> Weight {
+ (11_100_000 as Weight)
+ .saturating_add(DbWeight::get().reads(2 as Weight))
+ .saturating_add(DbWeight::get().writes(1 as Weight))
+ }
+ fn set_variable_on_chain_schema() -> Weight {
+ (11_100_000 as Weight)
+ .saturating_add(DbWeight::get().reads(2 as Weight))
+ .saturating_add(DbWeight::get().writes(1 as Weight))
+ }
+ fn set_variable_meta_data() -> Weight {
+ (17_500_000 as Weight)
+ .saturating_add(DbWeight::get().reads(2 as Weight))
+ .saturating_add(DbWeight::get().writes(1 as Weight))
+ }
}