git.delta.rocks / unique-network / refs/commits / eaea9411a084

difftreelog

Merge pull request #16 from usetech-llc/feature/NFTPAR-142

str-mv2020-11-16parents: #6d406a4 #eca8c84.patch.diff
in: master
Feature/nftpar-142

7 files changed

modifiedREADME.mddiffbeforeafterboth
167 "CollectionMode": {167 "CollectionMode": {
168 "_enum": {168 "_enum": {
169 "Invalid": null,169 "Invalid": null,
170 "NFT": "u32",170 "NFT": null,
171 "Fungible": "u32",171 "Fungible": "u32",
172 "ReFungible": "(u32, u32)"172 "ReFungible": "u32"
173 }173 }
174 },174 },
175 "Ownership": {175 "Ownership": {
189 "NftItemType": {189 "NftItemType": {
190 "Collection": "u64",190 "Collection": "u64",
191 "Owner": "AccountId",191 "Owner": "AccountId",
192 "Data": "Vec<u8>"192 "ConstData": "Vec<u8>",
193 "VariableData": "Vec<u8>"
193 },194 },
194 "Ownership": {195 "Ownership": {
195 "owner": "AccountId",196 "owner": "AccountId",
198 "ReFungibleItemType": {199 "ReFungibleItemType": {
199 "Collection": "u64",200 "Collection": "u64",
200 "Owner": "Vec<Ownership<AccountId>>",201 "Owner": "Vec<Ownership<AccountId>>",
201 "Data": "Vec<u8>"202 "ConstData": "Vec<u8>",
203 "VariableData": "Vec<u8>"
202 },204 },
203 "CollectionType": {205 "CollectionType": {
204 "Owner": "AccountId",206 "Owner": "AccountId",
208 "Name": "Vec<u16>",210 "Name": "Vec<u16>",
209 "Description": "Vec<u16>",211 "Description": "Vec<u16>",
210 "TokenPrefix": "Vec<u8>",212 "TokenPrefix": "Vec<u8>",
211 "CustomDataSize": "u32",
212 "MintMode": "bool",213 "MintMode": "bool",
213 "OffchainSchema": "Vec<u8>",214 "OffchainSchema": "Vec<u8>",
214 "Sponsor": "AccountId",215 "Sponsor": "AccountId",
215 "UnconfirmedSponsor": "AccountId"216 "UnconfirmedSponsor": "AccountId",
217 "VariableOnChainSchema": "Vec<u8>",
218 "ConstOnChainSchema": "Vec<u8>"
216 },219 },
217 "ApprovePermissions": {220 "ApprovePermissions": {
218 "Approved": "AccountId",221 "Approved": "AccountId",
221 "RawData": "Vec<u8>",224 "RawData": "Vec<u8>",
222 "Address": "AccountId",225 "Address": "AccountId",
223 "LookupSource": "AccountId",226 "LookupSource": "AccountId",
224 "Weight": "u64"227 "Weight": "u64",
228 "CreateNftData": {
229 "const_data": "Vec<u8>",
230 "variable_data": "Vec<u8>"
231 },
232 "CreateFungibleData": {},
233 "CreateReFungibleData": {
234 "const_data": "Vec<u8>",
235 "variable_data": "Vec<u8>"
236 },
237 "CreateItemData": {
238 "_enum": {
239 "NFT": "CreateNftData",
240 "Fungible": "CreateFungibleData",
241 "ReFungible": "CreateReFungibleData"
242 }
243 }
225}244}
226245
227```246```
modifiednode/src/chain_spec.rsdiffbeforeafterboth
159 1,159 1,
160 CollectionType {160 CollectionType {
161 owner: get_account_id_from_seed::<sr25519::Public>("Alice"),161 owner: get_account_id_from_seed::<sr25519::Public>("Alice"),
162 mode: CollectionMode::NFT(50),162 mode: CollectionMode::NFT,
163 access: AccessMode::Normal,163 access: AccessMode::Normal,
164 decimal_points: 0,164 decimal_points: 0,
165 name: vec![],165 name: vec![],
166 description: vec![],166 description: vec![],
167 token_prefix: vec![],167 token_prefix: vec![],
168 custom_data_size: 50,
169 mint_mode: false,168 mint_mode: false,
170 offchain_schema: vec![],169 offchain_schema: vec![],
171 sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),170 sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),
172 unconfirmed_sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),171 unconfirmed_sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),
172 const_on_chain_schema: vec![],
173 variable_on_chain_schema: vec![]
173 },174 },
174 )],175 )],
175 nft_item_id: vec![],176 nft_item_id: vec![],
modifiedpallets/nft/src/benchmarking.rsdiffbeforeafterboth
99
10 const SEED: u32 = 1;10 const SEED: u32 = 1;
11
12 fn default_nft_data() -> CreateItemData {
13 CreateItemData::NFT(CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] })
14 }
15
16 fn default_fungible_data () -> CreateItemData {
17 CreateItemData::Fungible(CreateFungibleData { })
18 }
19
20 fn default_re_fungible_data () -> CreateItemData {
21 CreateItemData::ReFungible(CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] })
22 }
23
1124
12 benchmarks! {25 benchmarks! {
17 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();30 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
18 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();31 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
19 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();32 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
20 let mode: CollectionMode = CollectionMode::NFT(2000);33 let mode: CollectionMode = CollectionMode::NFT;
21 let caller: T::AccountId = account("caller", 0, SEED);34 let caller: T::AccountId = account("caller", 0, SEED);
22 }: create_collection(RawOrigin::Signed(caller.clone()), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode)35 }: create_collection(RawOrigin::Signed(caller.clone()), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode)
23 verify {36 verify {
28 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();41 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
29 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();42 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
30 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();43 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
31 let mode: CollectionMode = CollectionMode::NFT(2000);44 let mode: CollectionMode = CollectionMode::NFT;
32 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());45 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
33 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;46 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
34 }: destroy_collection(RawOrigin::Signed(caller.clone()), 2)47 }: destroy_collection(RawOrigin::Signed(caller.clone()), 2)
37 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();50 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
38 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();51 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
39 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();52 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
40 let mode: CollectionMode = CollectionMode::NFT(2000);53 let mode: CollectionMode = CollectionMode::NFT;
41 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());54 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
42 let whitelist_account: T::AccountId = account("admin", 0, SEED);55 let whitelist_account: T::AccountId = account("admin", 0, SEED);
43 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;56 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
47 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();60 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
48 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();61 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
49 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();62 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
50 let mode: CollectionMode = CollectionMode::NFT(2000);63 let mode: CollectionMode = CollectionMode::NFT;
51 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());64 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
52 let whitelist_account: T::AccountId = account("admin", 0, SEED);65 let whitelist_account: T::AccountId = account("admin", 0, SEED);
53 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;66 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
58 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();71 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
59 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();72 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
60 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();73 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
61 let mode: CollectionMode = CollectionMode::NFT(2000);74 let mode: CollectionMode = CollectionMode::NFT;
62 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());75 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
63 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;76 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
64 }: set_public_access_mode(RawOrigin::Signed(caller.clone()), 2, AccessMode::WhiteList)77 }: set_public_access_mode(RawOrigin::Signed(caller.clone()), 2, AccessMode::WhiteList)
67 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();80 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
68 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();81 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
69 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();82 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
70 let mode: CollectionMode = CollectionMode::NFT(2000);83 let mode: CollectionMode = CollectionMode::NFT;
71 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());84 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
72 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;85 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
73 }: set_mint_permission(RawOrigin::Signed(caller.clone()), 2, true)86 }: set_mint_permission(RawOrigin::Signed(caller.clone()), 2, true)
76 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();89 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
77 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();90 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
78 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();91 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
79 let mode: CollectionMode = CollectionMode::NFT(2000);92 let mode: CollectionMode = CollectionMode::NFT;
80 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());93 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
81 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;94 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
82 let new_owner: T::AccountId = account("admin", 0, SEED);95 let new_owner: T::AccountId = account("admin", 0, SEED);
86 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();99 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
87 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();100 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
88 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();101 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
89 let mode: CollectionMode = CollectionMode::NFT(2000);102 let mode: CollectionMode = CollectionMode::NFT;
90 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());103 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
91 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;104 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
92 let new_admin: T::AccountId = account("admin", 0, SEED);105 let new_admin: T::AccountId = account("admin", 0, SEED);
96 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();109 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
97 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();110 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
98 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();111 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
99 let mode: CollectionMode = CollectionMode::NFT(2000);112 let mode: CollectionMode = CollectionMode::NFT;
100 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());113 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
101 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;114 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
102 let new_admin: T::AccountId = account("admin", 0, SEED);115 let new_admin: T::AccountId = account("admin", 0, SEED);
107 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();120 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
108 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();121 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
109 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();122 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
110 let mode: CollectionMode = CollectionMode::NFT(2000);123 let mode: CollectionMode = CollectionMode::NFT;
111 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());124 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
112 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;125 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
113 }: set_collection_sponsor(RawOrigin::Signed(caller.clone()), 2, caller.clone())126 }: set_collection_sponsor(RawOrigin::Signed(caller.clone()), 2, caller.clone())
116 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();129 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
117 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();130 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
118 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();131 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
119 let mode: CollectionMode = CollectionMode::NFT(2000);132 let mode: CollectionMode = CollectionMode::NFT;
120 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());133 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
121 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;134 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
122 Nft::<T>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?;135 Nft::<T>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?;
126 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();139 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
127 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();140 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
128 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();141 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
129 let mode: CollectionMode = CollectionMode::NFT(2000);142 let mode: CollectionMode = CollectionMode::NFT;
130 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());143 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
131 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;144 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
132 Nft::<T>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?;145 Nft::<T>::set_collection_sponsor(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone())?;
138 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();151 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
139 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();152 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
140 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();153 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
141 let mode: CollectionMode = CollectionMode::NFT(2000);154 let mode: CollectionMode = CollectionMode::NFT;
142 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());155 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
143 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;156 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
144157 let data = default_nft_data();
158
145 }: create_item(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec(), caller.clone())159 }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
146160
147 #[extra]161 #[extra]
148 create_item_nft_large {162 create_item_nft_large {
149 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();163 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
150 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();164 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
151 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();165 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
152 let mode: CollectionMode = CollectionMode::NFT(2000);166 let mode: CollectionMode = CollectionMode::NFT;
153 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());167 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
154 let mut item_large: Vec<u8> = Vec::new(); 168 let nft_data = CreateNftData {
169 const_data: vec![],
170 variable_data: vec![]
171 };
155 for i in 0..1998 {172 for i in 0..1998 {
156 item_large.push(10);173 nft_data.const_data.push(10);
174 nft_data.variable_data.push(10);
157 }175 }
176 let mut data = CreateItemData::NFT(nft_data);
158 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;177 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
159178
160 }: create_item(RawOrigin::Signed(caller.clone()), 2, item_large, caller.clone())179 }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
161180
162 // fungible item181 // fungible item
163 create_item_fungible {182 create_item_fungible {
167 let mode: CollectionMode = CollectionMode::Fungible(3);186 let mode: CollectionMode = CollectionMode::Fungible(3);
168 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());187 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
169 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;188 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
189 let data = default_fungible_data();
170190
171 }: create_item(RawOrigin::Signed(caller.clone()), 2, [].to_vec(), caller.clone())191 }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
172192
173 // refungible item193 // refungible item
174 create_item_refungible {194 create_item_refungible {
175 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();195 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
176 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();196 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
177 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();197 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
178 let mode: CollectionMode = CollectionMode::ReFungible(3, 3);198 let mode: CollectionMode = CollectionMode::ReFungible(3);
179 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());199 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
180 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;200 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
201 let data = default_re_fungible_data();
181202
182 }: create_item(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec(), caller.clone())203 }: create_item(RawOrigin::Signed(caller.clone()), 2, caller.clone(), data)
183204
184 burn_item {205 burn_item {
185 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();206 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
186 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();207 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
187 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();208 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
188 let mode: CollectionMode = CollectionMode::NFT(2000);209 let mode: CollectionMode = CollectionMode::NFT;
189 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());210 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
190 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;211 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
212 let data = default_nft_data();
191 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1, 2, 3].to_vec(), caller.clone())?;213 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
192214
193 }: burn_item(RawOrigin::Signed(caller.clone()), 2, 1)215 }: burn_item(RawOrigin::Signed(caller.clone()), 2, 1)
194216
195 transfer_nft {217 transfer_nft {
196 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();218 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
197 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();219 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
198 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();220 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
199 let mode: CollectionMode = CollectionMode::NFT(2000);221 let mode: CollectionMode = CollectionMode::NFT;
200 let recipient: T::AccountId = account("recipient", 0, SEED);222 let recipient: T::AccountId = account("recipient", 0, SEED);
201 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());223 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
202 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;224 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
225 let data = default_nft_data();
203 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1, 2, 3].to_vec(), caller.clone())?;226 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
204227
205 }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)228 }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)
206 229
212 let recipient: T::AccountId = account("recipient", 0, SEED);235 let recipient: T::AccountId = account("recipient", 0, SEED);
213 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());236 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
214 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;237 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
238 let data = default_fungible_data();
215 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [].to_vec(), caller.clone())?;239 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
216240
217 }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)241 }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)
218242
219 transfer_refungible {243 transfer_refungible {
220 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();244 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
221 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();245 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
222 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();246 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
223 let mode: CollectionMode = CollectionMode::ReFungible(3,3);247 let mode: CollectionMode = CollectionMode::ReFungible(3);
224 let recipient: T::AccountId = account("recipient", 0, SEED);248 let recipient: T::AccountId = account("recipient", 0, SEED);
225 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());249 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
226 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;250 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
251 let data = default_re_fungible_data();
227 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?;252 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
228253
229 }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)254 }: transfer(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1, 1)
230255
231 approve {256 approve {
232 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();257 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
233 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();258 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
234 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();259 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
235 let mode: CollectionMode = CollectionMode::ReFungible(3,3);260 let mode: CollectionMode = CollectionMode::ReFungible(3);
236 let recipient: T::AccountId = account("recipient", 0, SEED);261 let recipient: T::AccountId = account("recipient", 0, SEED);
237 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());262 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
238 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;263 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
264 let data = default_re_fungible_data();
239 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?;265 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
240266
241 }: approve(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1)267 }: approve(RawOrigin::Signed(caller.clone()), recipient.clone(), 2, 1)
242268
245 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();271 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
246 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();272 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
247 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();273 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
248 let mode: CollectionMode = CollectionMode::NFT(300);274 let mode: CollectionMode = CollectionMode::NFT;
249 let recipient: T::AccountId = account("recipient", 0, SEED);275 let recipient: T::AccountId = account("recipient", 0, SEED);
250 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());276 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
251 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;277 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
278 let data = default_nft_data();
252 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?;279 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
253 Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;280 Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;
254281
255 }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)282 }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)
263 let recipient: T::AccountId = account("recipient", 0, SEED);290 let recipient: T::AccountId = account("recipient", 0, SEED);
264 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());291 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
265 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;292 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
293 let data = default_fungible_data();
266 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [].to_vec(), caller.clone())?;294 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
267 Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;295 Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;
268296
269 }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)297 }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)
273 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();301 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
274 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();302 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
275 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();303 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
276 let mode: CollectionMode = CollectionMode::ReFungible(3,3);304 let mode: CollectionMode = CollectionMode::ReFungible(3);
277 let recipient: T::AccountId = account("recipient", 0, SEED);305 let recipient: T::AccountId = account("recipient", 0, SEED);
278 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());306 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
279 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;307 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
308 let data = default_re_fungible_data();
280 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, [1,2,3].to_vec(), caller.clone())?;309 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
281 Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;310 Nft::<T>::approve(RawOrigin::Signed(caller.clone()).into(), recipient.clone(), 2, 1)?;
282311
283 }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)312 }: transfer_from(RawOrigin::Signed(caller.clone()), caller.clone(), recipient.clone(), 2, 1, 1)
286 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();315 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
287 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();316 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
288 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();317 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
289 let mode: CollectionMode = CollectionMode::ReFungible(3,3);318 let mode: CollectionMode = CollectionMode::ReFungible(3);
290 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());319 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
291 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;320 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
292321
293 }: set_offchain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())322 }: set_offchain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())
323
324 set_const_on_chain_schema {
325 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
326 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
327 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
328 let mode: CollectionMode = CollectionMode::ReFungible(3);
329 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
330 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
331 }: set_const_on_chain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())
332
333 set_variable_on_chain_schema {
334 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
335 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
336 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
337 let mode: CollectionMode = CollectionMode::ReFungible(3);
338 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
339 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
340 }: set_variable_on_chain_schema(RawOrigin::Signed(caller.clone()), 2, [1,2,3].to_vec())
341
342 set_variable_meta_data {
343 let col_name1: Vec<u16> = "Test1".encode_utf16().collect::<Vec<u16>>();
344 let col_desc1: Vec<u16> = "TestDescription1".encode_utf16().collect::<Vec<u16>>();
345 let token_prefix1: Vec<u8> = b"token_prefix1".to_vec();
346 let mode: CollectionMode = CollectionMode::NFT;
347 let caller: T::AccountId = T::AccountId::from(whitelisted_caller());
348 Nft::<T>::create_collection(RawOrigin::Signed(caller.clone()).into(), col_name1.clone(), col_desc1.clone(), token_prefix1.clone(), mode.clone())?;
349 let data = default_nft_data();
350 Nft::<T>::create_item(RawOrigin::Signed(caller.clone()).into(), 2, caller.clone(), data)?;
351
352 }: set_variable_meta_data(RawOrigin::Signed(caller.clone()), 2, 1, [1, 2, 3].to_vec())
294 }353}
modifiedpallets/nft/src/default_weights.rsdiffbeforeafterboth
92 .saturating_add(DbWeight::get().reads(2 as Weight))92 .saturating_add(DbWeight::get().reads(2 as Weight))
93 .saturating_add(DbWeight::get().writes(1 as Weight))93 .saturating_add(DbWeight::get().writes(1 as Weight))
94 }94 }
95 fn set_const_on_chain_schema() -> Weight {
96 (11_100_000 as Weight)
97 .saturating_add(DbWeight::get().reads(2 as Weight))
98 .saturating_add(DbWeight::get().writes(1 as Weight))
99 }
100 fn set_variable_on_chain_schema() -> Weight {
101 (11_100_000 as Weight)
102 .saturating_add(DbWeight::get().reads(2 as Weight))
103 .saturating_add(DbWeight::get().writes(1 as Weight))
104 }
105 fn set_variable_meta_data() -> Weight {
106 (17_500_000 as Weight)
107 .saturating_add(DbWeight::get().reads(2 as Weight))
108 .saturating_add(DbWeight::get().writes(1 as Weight))
109 }
95 // fn enable_contract_sponsoring() -> Weight {110 // fn enable_contract_sponsoring() -> Weight {
96 // (0 as Weight)111 // (0 as Weight)
97 // .saturating_add(DbWeight::get().reads(1 as Weight))112 // .saturating_add(DbWeight::get().reads(1 as Weight))
modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
10pub use frame_support::{10pub use frame_support::{
11 construct_runtime, decl_event, decl_module, decl_storage,11 construct_runtime, decl_event, decl_module, decl_storage,
12 dispatch::DispatchResult,12 dispatch::DispatchResult,
13 ensure, parameter_types,13 ensure, parameter_types, fail,
14 traits::{14 traits::{
15 Currency, ExistenceRequirement, Get, Imbalance, KeyOwnerProofSystem, OnUnbalanced,15 Currency, ExistenceRequirement, Get, Imbalance, KeyOwnerProofSystem, OnUnbalanced,
16 Randomness, WithdrawReason,16 Randomness, WithdrawReason,
53#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]53#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
54pub enum CollectionMode {54pub enum CollectionMode {
55 Invalid,55 Invalid,
56 // custom data size56 NFT,
57 NFT(u32),
58 // decimal points57 // decimal points
59 Fungible(u32),58 Fungible(u32),
60 // custom data size and decimal points59 // decimal points
61 ReFungible(u32, u32),60 ReFungible(u32),
62}61}
6362
64impl Into<u8> for CollectionMode {63impl Into<u8> for CollectionMode {
65 fn into(self) -> u8 {64 fn into(self) -> u8 {
66 match self {65 match self {
67 CollectionMode::Invalid => 0,66 CollectionMode::Invalid => 0,
68 CollectionMode::NFT(_) => 1,67 CollectionMode::NFT => 1,
69 CollectionMode::Fungible(_) => 2,68 CollectionMode::Fungible(_) => 2,
70 CollectionMode::ReFungible(_, _) => 3,69 CollectionMode::ReFungible(_) => 3,
71 }70 }
72 }71 }
73}72}
107 pub name: Vec<u16>, // 64 include null escape char106 pub name: Vec<u16>, // 64 include null escape char
108 pub description: Vec<u16>, // 256 include null escape char107 pub description: Vec<u16>, // 256 include null escape char
109 pub token_prefix: Vec<u8>, // 16 include null escape char108 pub token_prefix: Vec<u8>, // 16 include null escape char
110 pub custom_data_size: u32,
111 pub mint_mode: bool,109 pub mint_mode: bool,
112 pub offchain_schema: Vec<u8>,110 pub offchain_schema: Vec<u8>,
113 pub sponsor: AccountId, // Who pays fees. If set to default address, the fees are applied to the transaction sender111 pub sponsor: AccountId, // Who pays fees. If set to default address, the fees are applied to the transaction sender
114 pub unconfirmed_sponsor: AccountId, // Sponsor address that has not yet confirmed sponsorship112 pub unconfirmed_sponsor: AccountId, // Sponsor address that has not yet confirmed sponsorship
113 pub variable_on_chain_schema: Vec<u8>, //
114 pub const_on_chain_schema: Vec<u8>, //
115}115}
116116
117#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]117#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
126pub struct NftItemType<AccountId> {126pub struct NftItemType<AccountId> {
127 pub collection: u64,127 pub collection: u64,
128 pub owner: AccountId,128 pub owner: AccountId,
129 pub data: Vec<u8>,129 pub const_data: Vec<u8>,
130 pub variable_data: Vec<u8>,
130}131}
131132
132#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]133#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
142pub struct ReFungibleItemType<AccountId> {143pub struct ReFungibleItemType<AccountId> {
143 pub collection: u64,144 pub collection: u64,
144 pub owner: Vec<Ownership<AccountId>>,145 pub owner: Vec<Ownership<AccountId>>,
145 pub data: Vec<u8>,146 pub const_data: Vec<u8>,
147 pub variable_data: Vec<u8>,
146}148}
147149
148#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]150#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
197 fn set_collection_sponsor() -> Weight;199 fn set_collection_sponsor() -> Weight;
198 fn confirm_sponsorship() -> Weight;200 fn confirm_sponsorship() -> Weight;
199 fn remove_collection_sponsor() -> Weight;201 fn remove_collection_sponsor() -> Weight;
200 fn create_item(s: usize, ) -> Weight;202 fn create_item(s: usize) -> Weight;
201 fn burn_item() -> Weight;203 fn burn_item() -> Weight;
202 fn transfer() -> Weight;204 fn transfer() -> Weight;
203 fn approve() -> Weight;205 fn approve() -> Weight;
204 fn transfer_from() -> Weight;206 fn transfer_from() -> Weight;
205 fn set_offchain_schema() -> Weight;207 fn set_offchain_schema() -> Weight;
208 fn set_const_on_chain_schema() -> Weight;
209 fn set_variable_on_chain_schema() -> Weight;
210 fn set_variable_meta_data() -> Weight;
206 // fn enable_contract_sponsoring() -> Weight;211 // fn enable_contract_sponsoring() -> Weight;
207}212}
208213
214#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
215#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
216pub struct CreateNftData {
217 pub const_data: Vec<u8>,
218 pub variable_data: Vec<u8>,
219}
220
221#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
222#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
223pub struct CreateFungibleData {
224}
225
226#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
227#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
228pub struct CreateReFungibleData {
229 pub const_data: Vec<u8>,
230 pub variable_data: Vec<u8>,
231}
232
233#[derive(Encode, Decode, Debug, Clone, PartialEq)]
234#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
235pub enum CreateItemData {
236 NFT(CreateNftData),
237 Fungible(CreateFungibleData),
238 ReFungible(CreateReFungibleData)
239}
240
241impl CreateItemData {
242 pub fn len(&self) -> usize {
243 let len = match self {
244 CreateItemData::NFT(data) => data.variable_data.len() + data.const_data.len(),
245 CreateItemData::ReFungible(data) => data.variable_data.len() + data.const_data.len(),
246 _ => 0
247 };
248
249 return len;
250 }
251}
252
253impl From<CreateNftData> for CreateItemData {
254 fn from(item: CreateNftData) -> Self {
255 CreateItemData::NFT(item)
256 }
257}
258
259impl From<CreateReFungibleData> for CreateItemData {
260 fn from(item: CreateReFungibleData) -> Self {
261 CreateItemData::ReFungible(item)
262 }
263}
264
265impl From<CreateFungibleData> for CreateItemData {
266 fn from(item: CreateFungibleData) -> Self {
267 CreateItemData::Fungible(item)
268 }
269}
270
209pub trait Trait: system::Trait + Sized + transaction_payment::Trait + pallet_contracts::Trait {271pub trait Trait: system::Trait + Sized + transaction_payment::Trait + pallet_contracts::Trait {
210 type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;272 type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
211273
362424
363 // Anyone can create a collection425 // Anyone can create a collection
364 let who = ensure_signed(origin)?;426 let who = ensure_signed(origin)?;
365 let custom_data_size = match mode {
366 CollectionMode::NFT(size) => {
367427
368 // bound Custom data size
369 ensure!(size < ChainLimit::get().custom_data_limit, "Custom data size bound exceeded");
370 size
371 },
372 CollectionMode::ReFungible(size, _) => {
373
374 // bound Custom data size
375 ensure!(size < ChainLimit::get().custom_data_limit, "Custom data size bound exceeded");
376 size
377 },
378 _ => 0
379 };
380
381 let decimal_points = match mode {428 let decimal_points = match mode {
382 CollectionMode::Fungible(points) => points,429 CollectionMode::Fungible(points) => points,
383 CollectionMode::ReFungible(_, points) => points,430 CollectionMode::ReFungible(points) => points,
384 _ => 0431 _ => 0
385 };432 };
386433
426 decimal_points: decimal_points,473 decimal_points: decimal_points,
427 token_prefix: prefix,474 token_prefix: prefix,
428 offchain_schema: Vec::new(),475 offchain_schema: Vec::new(),
429 custom_data_size: custom_data_size,
430 sponsor: T::AccountId::default(),476 sponsor: T::AccountId::default(),
431 unconfirmed_sponsor: T::AccountId::default(),477 unconfirmed_sponsor: T::AccountId::default(),
478 variable_on_chain_schema: Vec::new(),
479 const_on_chain_schema: Vec::new(),
432 };480 };
433481
434 // Add new collection to map482 // Add new collection to map
441 }489 }
442490
443 /// **DANGEROUS**: Destroys collection and all NFTs within this collection. Users irrecoverably lose their assets and may lose real money.491 /// **DANGEROUS**: Destroys collection and all NFTs within this collection. Users irrecoverably lose their assets and may lose real money.
444 /// 492 ///
445 /// # Permissions493 /// # Permissions
446 /// 494 ///
447 /// * Collection Owner.495 /// * Collection Owner.
771 /// 819 ///
772 /// * collection_id: ID of the collection.820 /// * collection_id: ID of the collection.
773 /// 821 ///
774 /// * 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.
775 ///
776 /// * owner: Address, initial owner of the NFT.822 /// * owner: Address, initial owner of the NFT.
823 ///
824 /// * data: Token data to store on chain.
777 // #[weight =825 // #[weight =
778 // (130_000_000 as Weight)826 // (130_000_000 as Weight)
779 // .saturating_add((2135 as Weight).saturating_mul((properties.len() as u64) as Weight))827 // .saturating_add((2135 as Weight).saturating_mul((properties.len() as u64) as Weight))
780 // .saturating_add(RocksDbWeight::get().reads(10 as Weight))828 // .saturating_add(RocksDbWeight::get().reads(10 as Weight))
781 // .saturating_add(RocksDbWeight::get().writes(8 as Weight))]829 // .saturating_add(RocksDbWeight::get().writes(8 as Weight))]
782830
783 #[weight = T::WeightInfo::create_item(properties.len())]831 #[weight = T::WeightInfo::create_item(data.len())]
784 pub fn create_item(origin, collection_id: u64, properties: Vec<u8>, owner: T::AccountId) -> DispatchResult {832 pub fn create_item(origin, collection_id: u64, owner: T::AccountId, data: CreateItemData) -> DispatchResult {
785833
786 let sender = ensure_signed(origin)?;834 let sender = ensure_signed(origin)?;
787 Self::collection_exists(collection_id)?;835 Self::collection_exists(collection_id)?;
788 let target_collection = <Collection<T>>::get(collection_id);836 let target_collection = <Collection<T>>::get(collection_id);
789837
790 if !Self::is_owner_or_admin_permissions(collection_id, sender.clone()) {838 if !Self::is_owner_or_admin_permissions(collection_id, sender.clone()) {
791 ensure!(target_collection.mint_mode == true, "Public minting is not allowed for this collection");839 ensure!(target_collection.mint_mode == true, "Public minting is not allowed for this collection.");
792 Self::check_white_list(collection_id, &owner)?;840 Self::check_white_list(collection_id, &owner)?;
793 Self::check_white_list(collection_id, &sender)?;841 Self::check_white_list(collection_id, &sender)?;
794 }842 }
795843
796 match target_collection.mode844 match target_collection.mode
797 {845 {
798 CollectionMode::NFT(_) => {846 CollectionMode::NFT => {
799847 if let CreateItemData::NFT(data) = data {
800 // check size848 // check sizes
801 ensure!(target_collection.custom_data_size >= properties.len() as u32, "Size of item is too large");849 ensure!(ChainLimit::get().custom_data_limit >= data.const_data.len() as u32, "const_data exceeded data limit.");
802850 ensure!(ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32, "variable_data exceeded data limit.");
851
803 // Create nft item852 // Create nft item
804 let item = NftItemType {853 let item = NftItemType {
805 collection: collection_id,854 collection: collection_id,
806 owner: owner,855 owner: owner,
807 data: properties.clone(),856 const_data: data.const_data.clone(),
808 };857 variable_data: data.variable_data.clone()
809858 };
859
810 Self::add_nft_item(item)?;860 Self::add_nft_item(item)?;
811861
862 } else {
863 fail!("Not NFT item data used to mint in NFT collection.");
864 }
812 },865 },
813 CollectionMode::Fungible(_) => {866 CollectionMode::Fungible(_) => {
814
815 // check size867 if let CreateItemData::Fungible(_) = data {
816 ensure!(properties.len() as u32 == 0, "Size of item must be 0 with fungible type");868
817
818 let item = FungibleItemType {869 let item = FungibleItemType {
819 collection: collection_id,870 collection: collection_id,
820 owner: owner,871 owner: owner,
821 value: (10 as u128).pow(target_collection.decimal_points)872 value: (10 as u128).pow(target_collection.decimal_points)
822 };873 };
823874
824 Self::add_fungible_item(item)?;875 Self::add_fungible_item(item)?;
876 } else {
877 fail!("Not Fungible item data used to mint in Fungible collection.");
878 }
825 },879 },
826 CollectionMode::ReFungible(_, _) => {880 CollectionMode::ReFungible(_) => {
827881 if let CreateItemData::ReFungible(data) = data {
828 // check size882
883 // check sizes
829 ensure!(target_collection.custom_data_size >= properties.len() as u32, "Size of item is too large");884 ensure!(ChainLimit::get().custom_data_limit >= data.const_data.len() as u32, "const_data exceeded data limit.");
830885 ensure!(ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32, "variable_data exceeded data limit.");
886
831 let mut owner_list = Vec::new();887 let mut owner_list = Vec::new();
832 let value = (10 as u128).pow(target_collection.decimal_points);888 let value = (10 as u128).pow(target_collection.decimal_points);
833 owner_list.push(Ownership {owner: owner.clone(), fraction: value});889 owner_list.push(Ownership {owner: owner.clone(), fraction: value});
834890
835 let item = ReFungibleItemType {891 let item = ReFungibleItemType {
836 collection: collection_id,892 collection: collection_id,
837 owner: owner_list,893 owner: owner_list,
838 data: properties.clone()894 const_data: data.const_data.clone(),
895 variable_data: data.variable_data.clone()
839 };896 };
840897
841 Self::add_refungible_item(item)?;898 Self::add_refungible_item(item)?;
899 } else {
900 fail!("Not Re Fungible item data used to mint in Re Fungible collection.");
901 }
842 },902 },
843 _ => { ensure!(1 == 0,"just error"); }903 _ => { ensure!(1 == 0,"Unexpected collection type."); }
844
845 };904 };
846905
881940
882 match target_collection.mode941 match target_collection.mode
883 {942 {
884 CollectionMode::NFT(_) => Self::burn_nft_item(collection_id, item_id)?,943 CollectionMode::NFT => Self::burn_nft_item(collection_id, item_id)?,
885 CollectionMode::Fungible(_) => Self::burn_fungible_item(collection_id, item_id)?,944 CollectionMode::Fungible(_) => Self::burn_fungible_item(collection_id, item_id)?,
886 CollectionMode::ReFungible(_, _) => Self::burn_refungible_item(collection_id, item_id, sender.clone())?,945 CollectionMode::ReFungible(_) => Self::burn_refungible_item(collection_id, item_id, sender.clone())?,
887 _ => ()946 _ => ()
888 };947 };
889948
934993
935 match target_collection.mode994 match target_collection.mode
936 {995 {
937 CollectionMode::NFT(_) => Self::transfer_nft(collection_id, item_id, sender.clone(), recipient)?,996 CollectionMode::NFT => Self::transfer_nft(collection_id, item_id, sender.clone(), recipient)?,
938 CollectionMode::Fungible(_) => Self::transfer_fungible(collection_id, item_id, value, sender.clone(), recipient)?,997 CollectionMode::Fungible(_) => Self::transfer_fungible(collection_id, item_id, value, sender.clone(), recipient)?,
939 CollectionMode::ReFungible(_, _) => Self::transfer_refungible(collection_id, item_id, value, sender.clone(), recipient)?,998 CollectionMode::ReFungible(_) => Self::transfer_refungible(collection_id, item_id, value, sender.clone(), recipient)?,
940 _ => ()999 _ => ()
941 };1000 };
9421001
10511110
1052 match target_collection.mode1111 match target_collection.mode
1053 {1112 {
1054 CollectionMode::NFT(_) => Self::transfer_nft(collection_id, item_id, from, recipient)?,1113 CollectionMode::NFT => Self::transfer_nft(collection_id, item_id, from, recipient)?,
1055 CollectionMode::Fungible(_) => Self::transfer_fungible(collection_id, item_id, value, from.clone(), recipient)?,1114 CollectionMode::Fungible(_) => Self::transfer_fungible(collection_id, item_id, value, from.clone(), recipient)?,
1056 CollectionMode::ReFungible(_, _) => Self::transfer_refungible(collection_id, item_id, value, from.clone(), recipient)?,1115 CollectionMode::ReFungible(_) => Self::transfer_refungible(collection_id, item_id, value, from.clone(), recipient)?,
1057 _ => ()1116 _ => ()
1058 };1117 };
10591118
10751134
1076 Ok(())1135 Ok(())
1077 }1136 }
1137
1138 /// Set off-chain data schema.
1139 ///
1140 /// # Permissions
1141 ///
1142 /// * Collection Owner
1143 /// * Collection Admin
1144 ///
1145 /// # Arguments
1146 ///
1147 /// * collection_id.
1148 ///
1149 /// * schema: String representing the offchain data schema.
1150 #[weight = T::WeightInfo::set_variable_meta_data()]
1151 pub fn set_variable_meta_data (
1152 origin,
1153 collection_id: u64,
1154 item_id: u64,
1155 data: Vec<u8>
1156 ) -> DispatchResult {
1157 let sender = ensure_signed(origin)?;
1158
1159 Self::collection_exists(collection_id)?;
10781160
1161 // Modify permissions check
1162 let target_collection = <Collection<T>>::get(collection_id);
1163 ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) ||
1164 Self::is_owner_or_admin_permissions(collection_id, sender.clone()),
1165 "Only item owner, collection owner and admins can modify item");
1166
1167 Self::item_exists(collection_id, item_id, &target_collection.mode)?;
1168
1169 match target_collection.mode
1170 {
1171 CollectionMode::NFT => Self::set_nft_variable_data(collection_id, item_id, data)?,
1172 CollectionMode::ReFungible(_) => Self::set_re_fungible_variable_data(collection_id, item_id, data)?,
1173 _ => ()
1174 };
1175
1176 Ok(())
1177 }
1178
1179
1079 /// Set off-chain data schema.1180 /// Set off-chain data schema.
1080 /// 1181 ///
1081 /// # Permissions1182 /// # Permissions
1104 Ok(())1205 Ok(())
1105 }1206 }
11061207
1208 /// Set const on-chain data schema.
1209 ///
1210 /// # Permissions
1211 ///
1212 /// * Collection Owner
1213 /// * Collection Admin
1214 ///
1215 /// # Arguments
1216 ///
1217 /// * collection_id.
1218 ///
1219 /// * schema: String representing the const on-chain data schema.
1220 #[weight = T::WeightInfo::set_const_on_chain_schema()]
1221 pub fn set_const_on_chain_schema (
1222 origin,
1223 collection_id: u64,
1224 schema: Vec<u8>
1225 ) -> DispatchResult {
1226 let sender = ensure_signed(origin)?;
1227 Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;
1228
1229 let mut target_collection = <Collection<T>>::get(collection_id);
1230 target_collection.const_on_chain_schema = schema;
1231 <Collection<T>>::insert(collection_id, target_collection);
1232
1233 Ok(())
1234 }
1235
1236 /// Set variable on-chain data schema.
1237 ///
1238 /// # Permissions
1239 ///
1240 /// * Collection Owner
1241 /// * Collection Admin
1242 ///
1243 /// # Arguments
1244 ///
1245 /// * collection_id.
1246 ///
1247 /// * schema: String representing the variable on-chain data schema.
1248 #[weight = T::WeightInfo::set_const_on_chain_schema()]
1249 pub fn set_variable_on_chain_schema (
1250 origin,
1251 collection_id: u64,
1252 schema: Vec<u8>
1253 ) -> DispatchResult {
1254 let sender = ensure_signed(origin)?;
1255 Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;
1256
1257 let mut target_collection = <Collection<T>>::get(collection_id);
1258 target_collection.variable_on_chain_schema = schema;
1259 <Collection<T>>::insert(collection_id, target_collection);
1260
1261 Ok(())
1262 }
1263
1107 // Sudo permissions function1264 // Sudo permissions function
1108 #[weight = 0]1265 #[weight = 0]
1109 pub fn set_chain_limits(1266 pub fn set_chain_limits(
1353 let target_collection = <Collection<T>>::get(collection_id);1510 let target_collection = <Collection<T>>::get(collection_id);
13541511
1355 match target_collection.mode {1512 match target_collection.mode {
1356 CollectionMode::NFT(_) => {1513 CollectionMode::NFT => {
1357 <NftItemList<T>>::get(collection_id, item_id).owner == subject1514 <NftItemList<T>>::get(collection_id, item_id).owner == subject
1358 }1515 }
1359 CollectionMode::Fungible(_) => {1516 CollectionMode::Fungible(_) => {
1360 <FungibleItemList<T>>::get(collection_id, item_id).owner == subject1517 <FungibleItemList<T>>::get(collection_id, item_id).owner == subject
1361 }1518 }
1362 CollectionMode::ReFungible(_, _) => {1519 CollectionMode::ReFungible(_) => {
1363 <ReFungibleItemList<T>>::get(collection_id, item_id)1520 <ReFungibleItemList<T>>::get(collection_id, item_id)
1364 .owner1521 .owner
1365 .iter()1522 .iter()
15921749
1593 // reset approved list1750 // reset approved list
1594 <ApprovedList<T>>::remove(collection_id, (item_id, old_owner));1751 <ApprovedList<T>>::remove(collection_id, (item_id, old_owner));
1752 Ok(())
1753 }
1754
1755 fn item_exists(
1756 collection_id: u64,
1757 item_id: u64,
1758 mode: &CollectionMode
1759 ) -> DispatchResult {
1760 match mode {
1761 CollectionMode::NFT => ensure!(<NftItemList<T>>::contains_key(collection_id, item_id), "Item does not exists"),
1762 CollectionMode::ReFungible(_) => ensure!(<ReFungibleItemList<T>>::contains_key(collection_id, item_id), "Item does not exists"),
1763 CollectionMode::Fungible(_) => ensure!(<FungibleItemList<T>>::contains_key(collection_id, item_id), "Item does not exists"),
1764 _ => ()
1765 };
1766
1767 Ok(())
1768 }
1769
1770 fn set_re_fungible_variable_data(
1771 collection_id: u64,
1772 item_id: u64,
1773 data: Vec<u8>
1774 ) -> DispatchResult {
1775 let mut item = <ReFungibleItemList<T>>::get(collection_id, item_id);
1776
1777 item.variable_data = data;
1778
1779 <ReFungibleItemList<T>>::insert(collection_id, item_id, item);
1780
1781 Ok(())
1782 }
1783
1784 fn set_nft_variable_data(
1785 collection_id: u64,
1786 item_id: u64,
1787 data: Vec<u8>
1788 ) -> DispatchResult {
1789 let mut item = <NftItemList<T>>::get(collection_id, item_id);
1790
1791 item.variable_data = data;
1792
1793 <NftItemList<T>>::insert(collection_id, item_id, item);
1794
1595 Ok(())1795 Ok(())
1596 }1796 }
15971797
18352035
1836 // sponsor timeout2036 // sponsor timeout
1837 let sponsor_transfer = match _collection_mode {2037 let sponsor_transfer = match _collection_mode {
1838 CollectionMode::NFT(_) => {2038 CollectionMode::NFT => {
1839 let basket = <NftTransferBasket<T>>::get(collection_id, _item_id);2039 let basket = <NftTransferBasket<T>>::get(collection_id, _item_id);
1840 let block_number = <system::Module<T>>::block_number() as T::BlockNumber;2040 let block_number = <system::Module<T>>::block_number() as T::BlockNumber;
1841 let limit_time = basket + ChainLimit::get().nft_sponsor_transfer_timeout.into();2041 let limit_time = basket + ChainLimit::get().nft_sponsor_transfer_timeout.into();
1869 true2069 true
1870 }2070 }
1871 }2071 }
1872 CollectionMode::ReFungible(_, _) => {2072 CollectionMode::ReFungible(_) => {
1873 let basket = <ReFungibleTransferBasket<T>>::get(collection_id, _item_id);2073 let basket = <ReFungibleTransferBasket<T>>::get(collection_id, _item_id);
1874 let block_number = <system::Module<T>>::block_number() as T::BlockNumber;2074 let block_number = <system::Module<T>>::block_number() as T::BlockNumber;
1875 let limit_time = basket + ChainLimit::get().nft_sponsor_transfer_timeout.into();2075 let limit_time = basket + ChainLimit::get().nft_sponsor_transfer_timeout.into();
modifiedpallets/nft/src/tests.rsdiffbeforeafterboth
1// Tests to be written here1// Tests to be written here
2use 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 };
66
7// Use cases tests region
8// #region
9#[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 10
13 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);
1610
17 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}
2622
27 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}
26
27fn default_fungible_data () -> CreateFungibleData {
28 CreateFungibleData { }
29}
30
31fn default_re_fungible_data () -> CreateReFungibleData {
32 CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }
33}
34
35fn 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();
39
40 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);
3648
37 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 id
58}
59
60fn create_test_collection(mode: &CollectionMode, id: u64) -> u64 {
61 create_test_collection_for_owner(&mode, 1, id)
62}
63
64fn 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 1
42 ));71 ));
72
73}
74
43 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());75// Use cases tests region
76// #region
77#[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}
4689
47#[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);
5495
55 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 }));
64
65 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 mode
72 ));
73 assert_eq!(TemplateModule::collection(1).owner, 1);
74
75 assert_ok!(TemplateModule::create_item(
76 origin1.clone(),
77 1,
78 [1, 2, 3].to_vec(),
79 1
80 ));
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_data
84 );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_data
105 );
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: 1000
95#[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);
102122
103 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 }));
112125
113 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 mode
120 ));
121 assert_eq!(TemplateModule::collection(1).owner, 1);
122
123 assert_ok!(TemplateModule::create_item(
124 origin1.clone(),
125 1,
126 [].to_vec(),
127 1
128 ));
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);
142138
143 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 }));
152
153 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 mode
161 ));
162 assert_eq!(TemplateModule::collection(1).owner, 1);
163141
164 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(),144
168 1
169 ));
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);
210184
211 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 }));
220187
221 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 mode
229 ));
230 assert_eq!(TemplateModule::collection(1).owner, 1);
231
232 assert_ok!(TemplateModule::create_item(
233 origin1.clone(),
234 1,
235 [1, 2, 3].to_vec(),
236 1
237 ));
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_data
241 );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_data
197 );
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: 1000
310#[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);
317272
318 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 }));
327
328 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 mode
335 ));
336 assert_eq!(TemplateModule::collection(1).owner, 1);
337
338 assert_ok!(TemplateModule::create_item(
339 origin1.clone(),
340 1,
341 [1, 2, 3].to_vec(),
342 1
343 ));
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]);
347277
278 let origin1 = Origin::signed(1);
348 // default scenario279 // default scenario
349 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);
365295
366 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 }));
375298
376 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 mode
384 ));
385 assert_eq!(TemplateModule::collection(1).owner, 1);
386301
387 assert_ok!(TemplateModule::create_item(
388 origin1.clone(),
389 1,
390 [1, 2, 3].to_vec(),
391 1
392 ));
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]);
396304
429#[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);
436343
437 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 }));
446
447 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 mode
455 ));
456 assert_eq!(TemplateModule::collection(1).owner, 1);
457346
458 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(),349
462 1
463 ));
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]);
467353
507#[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);
514
515 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 }));
524
525 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 mode
533 ));
534 assert_eq!(TemplateModule::collection(1).owner, 1);
535402
536 assert_ok!(TemplateModule::create_item(403 let data = default_re_fungible_data();
537 origin1.clone(),
538 1,
539 [1, 2, 3].to_vec(),
540 1
541 ));
542 assert_eq!(404 create_test_item(collection_id, &data.into());
543 TemplateModule::refungible_item_id(1, 1).data,405
544 [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: 1000
551 }
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]);
555408
607#[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());
614469
615 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 }));
624
625 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 mode
633 ));
634 assert_eq!(TemplateModule::collection(1).owner, 1);
635472
636 assert_ok!(TemplateModule::create_item(
637 origin1.clone(),
638 1,
639 [].to_vec(),
640 1
641 ));
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]);
645475
713#[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);
720
721 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 }));
730
731 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 mode
738 ));
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 2
743 ));555 ));
744 assert_eq!(TemplateModule::collection(1).owner, 2);556 assert_eq!(TemplateModule::collection(collection_id).owner, 2);
745 });557 });
746}558}
747559
748#[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);
755
756 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 }));
765
766 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 mode
773 ));
774 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));
775 });569 });
776}570}
777571
778#[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);
785578
786 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 }));
795
796 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 mode
803 ));
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 1
810 ));
811584
812 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());
813
814 // 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);
816587
828#[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);
835
836 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 }));
845
846 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 mode
853 ));
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 1
860 ));
861611
862 // 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);
883
884 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 }));
893
894 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 mode
902 ));
903633
904 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 true
908 ));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::WhiteList
913 ));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));
915645
916 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 1
922 ));
923650
924 assert_eq!(
925 TemplateModule::refungible_item_id(1, 1).data,
926 [1, 2, 3].to_vec()
927 );
928
929 // 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);
931653
943#[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);
950
951 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 }));
960
961 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 ));
985675
986 assert_eq!(TemplateModule::collection(1).owner, 1);
987 assert_eq!(TemplateModule::collection(2).owner, 2);
988 assert_eq!(TemplateModule::collection(3).owner, 3);
989
990 // collection admin676 // collection admin
991 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));
993679
994 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}
998684
999#[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);
1006693
1007 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);
1010696
1011 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 }));
1020
1021 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 ));
1042
1043 assert_eq!(TemplateModule::collection(1).owner, 1);
1044 assert_eq!(TemplateModule::collection(2).owner, 2);
1045 assert_eq!(TemplateModule::collection(3).owner, 3);
1046
1047 // collection admin697 // collection admin
1048 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));
1050700
1051 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);
1073
1074 let origin1 = Origin::signed(1);721 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3), 3);
1075
1076 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 }));
1085
1086 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 ));
1107
1108 assert_eq!(TemplateModule::collection(1).owner, 1);
1109 assert_eq!(TemplateModule::collection(2).owner, 1);
1110 assert_eq!(TemplateModule::collection(3).owner, 1);
1111
1112 // check balance before723 // check balance before
1113 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);
1116727
1117 // 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());
1124736
1125 assert_ok!(TemplateModule::create_item(
1126 origin1.clone(),
1127 2,
1128 [].to_vec(),
1129 1
1130 ));
1131
1132 assert_ok!(TemplateModule::create_item(
1133 origin1.clone(),
1134 3,
1135 [1, 1, 1].to_vec(),
1136 1
1137 ));
1138
1139 // 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}
1148746
1149#[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());
1157756
1158 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 }));
1167
1168 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 ));
1175
1176 assert_eq!(TemplateModule::collection(1).owner, 1);
1177
1178 // create item758
1179 assert_ok!(TemplateModule::create_item(
1180 origin1.clone(),
1181 1,
1182 [1, 1, 1].to_vec(),
1183 1
1184 ));
1185
1186 // approve759 // approve
1187 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);
1201773
1202 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 }));
1211776
1212 assert_ok!(TemplateModule::create_collection(
1213 origin1.clone(),
1214 col_name1.clone(),
1215 col_desc1.clone(),
1216 token_prefix1.clone(),
1217 mode
1218 ));
1219
1220 assert_eq!(TemplateModule::collection(1).owner, 1);
1221
1222 // create item
1223 assert_ok!(TemplateModule::create_item(
1224 origin1.clone(),
1225 1,
1226 [1, 1, 1].to_vec(),
1227 1
1228 ));
1229
1230 // approve777 // approve
1231 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);
1276821
1277 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 }));
1286
1287 assert_ok!(TemplateModule::create_collection(
1288 origin1.clone(),
1289 col_name1.clone(),
1290 col_desc1.clone(),
1291 token_prefix1.clone(),
1292 mode
1293 ));
1294
1295 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}
1299827
1300#[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);
1309836
1310 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 }));
1319
1320 assert_ok!(TemplateModule::create_collection(
1321 origin1.clone(),
1322 col_name1.clone(),
1323 col_desc1.clone(),
1324 token_prefix1.clone(),
1325 mode
1326 ));
1327
1328 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}
1333842
1334#[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);
1343849
1344 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 }));
1353
1354 assert_ok!(TemplateModule::create_collection(
1355 origin1.clone(),
1356 col_name1.clone(),
1357 col_desc1.clone(),
1358 token_prefix1.clone(),
1359 mode
1360 ));
1361
1362 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();
862
1372 let origin1 = Origin::signed(1);863 let origin1 = Origin::signed(1);
1373864
1374 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 }));
1383
1384 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);
1399878
1400 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 }));
1409
1410 assert_ok!(TemplateModule::create_collection(
1411 origin1.clone(),
1412 col_name1.clone(),
1413 col_desc1.clone(),
1414 token_prefix1.clone(),
1415 mode
1416 ));
1417
1418 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);
1435
1436 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 }));
1445
1446 assert_ok!(TemplateModule::create_collection(
1447 origin1.clone(),
1448 col_name1.clone(),
1449 col_desc1.clone(),
1450 token_prefix1.clone(),
1451 mode
1452 ));
1453
1454 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}
1460903
1461#[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);
1469910
1470 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 }));
1479
1480 assert_ok!(TemplateModule::create_collection(
1481 origin1.clone(),
1482 col_name1.clone(),
1483 col_desc1.clone(),
1484 token_prefix1.clone(),
1485 mode
1486 ));
1487
1488 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 2
1493 ));917 ));
1494 assert_eq!(TemplateModule::white_list(1).len(), 0);918 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);
1495 });919 });
1496}920}
1497921
1498#[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);
1507930
1508 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 }));
1517932
1518 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 mode
1524 ));
1525
1526 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
1527
1528 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 3
1533 ));938 ));
1534 assert_eq!(TemplateModule::white_list(1).len(), 0);939 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);
1535 });940 });
1536}941}
1537942
1538#[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);
1547951
1548 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 }));
1557
1558 assert_ok!(TemplateModule::create_collection(
1559 origin1.clone(),
1560 col_name1.clone(),
1561 col_desc1.clone(),
1562 token_prefix1.clone(),
1563 mode
1564 ));
1565
1566 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}
1574960
1575#[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);
1579966
1580 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 }));
1589
1590 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);
1606982
1607 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 }));
1616
1617 assert_ok!(TemplateModule::create_collection(
1618 origin1.clone(),
1619 col_name1.clone(),
1620 col_desc1.clone(),
1621 token_prefix1.clone(),
1622 mode
1623 ));
1624
1625 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}
1634992
1635// If address is already removed from white list, nothing happens993// If address is already removed from white list, nothing happens
1636#[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);
16441001
1645 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 }));
1654
1655 assert_ok!(TemplateModule::create_collection(
1656 origin1.clone(),
1657 col_name1.clone(),
1658 col_desc1.clone(),
1659 token_prefix1.clone(),
1660 mode
1661 ));
1662
1663 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 2
1668 ));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 2
1673 ));1012 ));
1674 assert_eq!(TemplateModule::white_list(1).len(), 0);1013 assert_eq!(TemplateModule::white_list(collection_id).len(), 0);
1675 });1014 });
1676}1015}
16771016
1678// 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);
16861024
1687 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 }));
1696
1697 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 mode
1704 ));
1705 assert_eq!(TemplateModule::collection(1).owner, 1);
17061029
1707 assert_ok!(TemplateModule::create_item(
1708 origin1.clone(),
1709 1,
1710 [1, 2, 3].to_vec(),
1711 1
1712 ));
1713
1714 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::WhiteList
1718 ));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));
17201036
1721 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);
1735
1736 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1737 collection_numbers_limit: 10,
1738 account_token_ownership_limit: 10,
1739 collections_admins_limit: 5,
1740 custom_data_limit: 2048,
1741 nft_sponsor_transfer_timeout: 15,
1742 fungible_sponsor_transfer_timeout: 15,
1743 refungible_sponsor_transfer_timeout: 15,
1744 }));
1745
1746 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 mode
1753 ));
1754 assert_eq!(TemplateModule::collection(1).owner, 1);
17551054
1756 assert_ok!(TemplateModule::create_item(
1757 origin1.clone(),
1758 1,
1759 [1, 2, 3].to_vec(),
1760 1
1761 ));
1762
1763 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::WhiteList
1767 ));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);
17961087
1797 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 }));
1806
1807 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 mode
1814 ));
1815 assert_eq!(TemplateModule::collection(1).owner, 1);
18161092
1817 assert_ok!(TemplateModule::create_item(
1818 origin1.clone(),
1819 1,
1820 [1, 2, 3].to_vec(),
1821 1
1822 ));
1823
1824 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::WhiteList
1828 ));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);
18451113
1846 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 }));
1855
1856 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 mode
1863 ));
1864 assert_eq!(TemplateModule::collection(1).owner, 1);
18651115
1866 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 1
1871 ));
18721118
1873 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::WhiteList
1877 ));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));
18801126
1881 // do approve1127 // do approve
1882 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);
18841130
1885 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 2
1889 ));1135 ));
18901136
1899#[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);
19061151
1907 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 }));
1916
1917 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 mode
1924 ));
1925 assert_eq!(TemplateModule::collection(1).owner, 1);
19261153
1927 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 1
1932 ));
19331156
1934 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::WhiteList
1938 ));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);
19541176
1955 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 }));
1964
1965 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 mode
1972 ));
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::WhiteList
1977 ));1182 ));
19781183
1989#[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);
19961200
1997 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 }));
2006
2007 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 mode
2014 ));
2015 assert_eq!(TemplateModule::collection(1).owner, 1);
20161205
2017 assert_ok!(TemplateModule::create_item(
2018 origin1.clone(),
2019 1,
2020 [1, 2, 3].to_vec(),
2021 1
2022 ));
2023
2024 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::WhiteList
2028 ));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));
20311213
2032 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);
20431224
2044 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 }));
2053
2054 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 mode
2061 ));
2062 assert_eq!(TemplateModule::collection(1).owner, 1);
20631229
2064 assert_ok!(TemplateModule::create_item(
2065 origin1.clone(),
2066 1,
2067 [1, 2, 3].to_vec(),
2068 1
2069 ));
2070
2071 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::WhiteList
2075 ));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));
20781237
2079 // do approve1238 // do approve
2080 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);
2102
2103 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 }));
2112
2113 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 mode
2120 ));
21211261
2122 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::WhiteList
2126 ));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 false
2131 ));1271 ));
21321272
2133 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 1
2138 ));
2139 });1275 });
2140}1276}
21411277
2142// 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);
21501285
2151 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 }));
2160
2161 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 mode
2169 ));
21701288
2171 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::WhiteList
2175 ));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 false
2180 ));1298 ));
21811299
2182 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1300 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));
21831301
2184 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);
22011318
2202 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 }));
2211
2212 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 mode
2220 ));
22211321
2222 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::WhiteList
2226 ));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 false
2231 ));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));
22331333
2234 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);
22491348
2250 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 }));
2259
2260 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 mode
2268 ));
22691351
2270 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::WhiteList
2274 ));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 false
2279 ));1361 ));
22801362
2281 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);
22961377
2297 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 }));
2306
2307 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 mode
2314 ));
23151379
2316 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::WhiteList
2320 ));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 true
2325 ));1389 ));
23261390
2327 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 1
2332 ));
2333 });1393 });
2334}1394}
23351395
2336// 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);
23441403
2345 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 }));
2354
2355 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 mode
2363 ));
23641406
2365 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::WhiteList
2369 ));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 true
2374 ));1416 ));
23751417
2376 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1418 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));
23771419
2378 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);
23951436
2396 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 }));
2405
2406 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 mode
2414 ));
24151439
2416 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::WhiteList
2420 ));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 true
2425 ));1449 ));
24261450
2427 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);
24421465
2443 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 }));
2452
2453 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 mode
2461 ));
24621468
2463 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::WhiteList
2467 ));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 true
2472 ));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));
24741480
2475 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);
2492
2493 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 }));
2502
2503 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 mode
2510 ));
2511 });1497 });
2512}1498}
25131499
2514// Total number of collections. Negotive test1500// Total number of collections. Negotive test
2515#[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);
25221505
2523 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 }));
2532
2533 let origin1 = Origin::signed(1);1506 let origin1 = Origin::signed(1);
25341507
2535 for _ in 0..10 {1508 for i in 0..default_collection_numbers_limit() {
2536
2537 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 }
25451511
1512 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();
1515
2546 // 11-th collection in chain. Expects error1516 // 11-th collection in chain. Expects error
2547 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::NFT
2553 ), "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);
25651534
2566 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 }));
2575
2576 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 mode
2583 ));
2584
2585 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 1
2590 ));
2591
2592 assert_ok!(TemplateModule::create_item(
2593 origin1.clone(),
2594 1,
2595 [1, 2, 3].to_vec(),
2596 1
2597 ));
2598 });1538 });
2599}1539}
26001540
2601// Owned tokens by a single address. Negotive test1541// Owned tokens by a single address. Negotive test
2602#[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);
2609
2610 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);
26191556
2620 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 mode
2627 ));
26281560
2629 assert_ok!(TemplateModule::create_item(
2630 origin1.clone(),
2631 1,
2632 [1, 2, 3].to_vec(),
2633 1
2634 ));
2635
2636 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);
2653
2654 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);
26631585
2664 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 mode
2671 ));
2672
2673 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}
26771592
2678// Number of collection admins. Negotive test1593// Number of collection admins. Negotive test
2679#[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);
2686
2687 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);
26961608
2697 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 mode
2704 ));
27051610
2706 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}
27101615
2711// 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);
27191631
1632 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 });
1637
1638 assert_noop!(TemplateModule::create_item(
1639 origin1.clone(),
1640 collection_id,
1641 1,
1642 too_big_const_data
1643 ), "const_data exceeded data limit.");
1644 });
1645}
1646
1647// 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 }));
27291660
1661 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1662
2730 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 });
1668
1669 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_data
2736 mode1674 ), "variable_data exceeded data limit.");
2737 ));
2738 });1675 });
2739}1676}
27401677
2741// 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 }));
27491691
1692 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1693
1694 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 });
1699
1700 assert_noop!(TemplateModule::create_item(
1701 origin1.clone(),
1702 collection_id,
1703 1,
1704 too_big_const_data
1705 ), "const_data exceeded data limit.");
1706 });
1707}
1708
1709// 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 }));
27591722
1723 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1724
2760 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 });
1730
1731 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_data
2766 mode1736 ), "variable_data exceeded data limit.");
2767 ), "Custom data size bound exceeded");
2768 });1737 });
2769}1738}
2770// #endregion1739// #endregion
27711740
1741#[test]
1742fn set_const_on_chain_schema() {
1743 new_test_ext().execute_with(|| {
1744 default_limits();
1745
1746 let collection_id = create_test_collection(&CollectionMode::NFT, 1);
1747
1748 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()));
1750
1751 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}
1755
1756#[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);
1762
1763 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()));
1765
1766 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}
modifiedruntime/src/nft_weights.rsdiffbeforeafterboth
93 .saturating_add(DbWeight::get().reads(2 as Weight))93 .saturating_add(DbWeight::get().reads(2 as Weight))
94 .saturating_add(DbWeight::get().writes(1 as Weight))94 .saturating_add(DbWeight::get().writes(1 as Weight))
95 }95 }
96 fn set_const_on_chain_schema() -> Weight {
97 (11_100_000 as Weight)
98 .saturating_add(DbWeight::get().reads(2 as Weight))
99 .saturating_add(DbWeight::get().writes(1 as Weight))
100 }
101 fn set_variable_on_chain_schema() -> Weight {
102 (11_100_000 as Weight)
103 .saturating_add(DbWeight::get().reads(2 as Weight))
104 .saturating_add(DbWeight::get().writes(1 as Weight))
105 }
106 fn set_variable_meta_data() -> Weight {
107 (17_500_000 as Weight)
108 .saturating_add(DbWeight::get().reads(2 as Weight))
109 .saturating_add(DbWeight::get().writes(1 as Weight))
110 }
96}111}
97112