difftreelog
transfer fix
in: master
4 files changed
Cargo.lockdiffbeforeafterboth--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3085,6 +3085,7 @@
dependencies = [
"frame-support",
"frame-system",
+ "log",
"pallet-transaction-payment",
"parity-scale-codec",
"serde",
pallets/nft/Cargo.tomldiffbeforeafterboth--- a/pallets/nft/Cargo.toml
+++ b/pallets/nft/Cargo.toml
@@ -36,6 +36,7 @@
[dependencies]
# third-party dependencies
serde = { version = "1.0.102", features = ["derive"] }
+log = "0.4.8"
[dependencies.sp-std]
default-features = false
pallets/nft/src/lib.rsdiffbeforeafterboth--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -371,7 +371,7 @@
let item = NftItemType {
collection: collection_id,
owner: owner,
- data: properties,
+ data: properties.clone(),
};
Self::add_nft_item(item)?;
@@ -380,17 +380,18 @@
CollectionMode::ReFungible(_, _) => {
let mut owner_list = Vec::new();
let value = (10 as u128).pow(target_collection.decimal_points);
- owner_list.push(Ownership {owner: owner, fraction: value});
+ owner_list.push(Ownership {owner: owner.clone(), fraction: value});
let item = ReFungibleItemType {
collection: collection_id,
owner: owner_list,
- data: properties
+ data: properties.clone()
};
Self::add_refungible_item(item)?;
},
- _ => ()
+ _ => { ensure!(1 == 0,"just error"); }
+
};
// call event
@@ -595,11 +596,11 @@
Self::add_token_index(item.collection, current_index, owner.clone())?;
<ItemListIndex>::insert(item.collection, current_index);
- <ReFungibleItemList<T>>::insert(item.collection, current_index, item);
+ <ReFungibleItemList<T>>::insert(item.collection, current_index, itemcopy);
// Update balance
- let new_balance = <Balance<T>>::get(itemcopy.collection, owner.clone()).checked_add(value).unwrap();
- <Balance<T>>::insert(itemcopy.collection, owner.clone(), new_balance);
+ let new_balance = <Balance<T>>::get(item.collection, owner.clone()).checked_add(value).unwrap();
+ <Balance<T>>::insert(item.collection, owner.clone(), new_balance);
Ok(())
}
@@ -626,7 +627,7 @@
let item = full_item.owner.iter().filter(|i| i.owner == owner).next().unwrap();
let amount = item.fraction;
- ensure!(amount < value.into(),"Item balance not enouth");
+ ensure!(amount >= value.into(),"Item balance not enouth");
// update balance
let balance_old_owner = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(value).unwrap();
@@ -637,9 +638,10 @@
let old_owner = item.owner.clone();
let new_owner_has_account = full_item.owner.iter().any(|i| i.owner == new_owner);
+ let val64 = value.into();
// transfer
- if amount == value.into() && !new_owner_has_account
+ if amount == val64 && !new_owner_has_account
{
// change owner
// new owner do not have account
@@ -653,17 +655,17 @@
else
{
let mut new_full_item = full_item.clone();
- new_full_item.owner.iter_mut().find(|i| i.owner == owner).unwrap().fraction -= amount;
+ new_full_item.owner.iter_mut().find(|i| i.owner == owner).unwrap().fraction -= val64;
// separate amount
if new_owner_has_account {
// new owner has account
- new_full_item.owner.iter_mut().find(|i| i.owner == new_owner).unwrap().fraction += amount;
+ new_full_item.owner.iter_mut().find(|i| i.owner == new_owner).unwrap().fraction += val64;
}
else
{
// new owner do not have account
- new_full_item.owner.push(Ownership { owner: new_owner.clone(), fraction: amount});
+ new_full_item.owner.push(Ownership { owner: new_owner.clone(), fraction: val64});
Self::add_token_index(collection_id, item_id, new_owner.clone())?;
}
pallets/nft/src/tests.rsdiffbeforeafterboth1// Tests to be written here2use crate::mock::*;3use frame_support::{assert_noop, assert_ok};45#[test]6fn create_collection_test() {7 new_test_ext().execute_with(|| {8 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();9 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();10 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1112 let size = 1024;13 let origin1 = Origin::signed(1);14 assert_ok!(TemplateModule::create_collection(15 origin1.clone(),16 col_name1.clone(),17 col_desc1.clone(),18 token_prefix1.clone(),19 size20 ));21 assert_eq!(TemplateModule::collection(1).owner, 1);22 });23}2425#[test]26fn change_collection_owner() {27 new_test_ext().execute_with(|| {28 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();29 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();30 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();3132 let size = 1024;33 let origin1 = Origin::signed(1);3435 assert_ok!(TemplateModule::create_collection(36 origin1.clone(),37 col_name1.clone(),38 col_desc1.clone(),39 token_prefix1.clone(),40 size41 ));42 assert_ok!(TemplateModule::change_collection_owner(43 origin1.clone(),44 1,45 246 ));47 assert_eq!(TemplateModule::collection(1).owner, 2);48 });49}5051#[test]52fn destroy_collection() {53 new_test_ext().execute_with(|| {54 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();55 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();56 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();5758 let size = 1024;59 let origin1 = Origin::signed(1);6061 assert_ok!(TemplateModule::create_collection(62 origin1.clone(),63 col_name1.clone(),64 col_desc1.clone(),65 token_prefix1.clone(),66 size67 ));68 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));69 });70}7172#[test]73fn create_item() {74 new_test_ext().execute_with(|| {75 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();76 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();77 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();7879 let size = 1024;80 let origin1 = Origin::signed(1);81 let origin2 = Origin::signed(2);8283 assert_ok!(TemplateModule::create_collection(84 origin1.clone(),85 col_name1.clone(),86 col_desc1.clone(),87 token_prefix1.clone(),88 size89 ));90 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));91 assert_ok!(TemplateModule::create_item(92 origin2.clone(),93 1,94 [1, 1, 1].to_vec()95 ));9697 // check balance (collection with id = 1, user id = 2)98 assert_eq!(TemplateModule::balance_count((1, 2)), 1);99 });100}101102#[test]103fn burn_item() {104 new_test_ext().execute_with(|| {105 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();106 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();107 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();108109 let size = 1024;110 let origin1 = Origin::signed(1);111 let origin2 = Origin::signed(2);112113 assert_ok!(TemplateModule::create_collection(114 origin1.clone(),115 col_name1.clone(),116 col_desc1.clone(),117 token_prefix1.clone(),118 size119 ));120 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));121 assert_ok!(TemplateModule::create_item(122 origin2.clone(),123 1,124 [1, 1, 1].to_vec()125 ));126127 // check balance (collection with id = 1, user id = 2)128 assert_eq!(TemplateModule::balance_count((1, 2)), 1);129130 // burn item131 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));132 assert_noop!(133 TemplateModule::burn_item(origin1.clone(), 1, 1),134 "Item does not exists"135 );136137 assert_eq!(TemplateModule::balance_count((1, 1)), 0);138 });139}140141#[test]142fn add_collection_admin() {143 new_test_ext().execute_with(|| {144 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();145 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();146 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();147148 let size = 1024;149 let origin1 = Origin::signed(1);150 let origin2 = Origin::signed(2);151 let origin3 = Origin::signed(3);152153 assert_ok!(TemplateModule::create_collection(154 origin1.clone(),155 col_name1.clone(),156 col_desc1.clone(),157 token_prefix1.clone(),158 size159 ));160 assert_ok!(TemplateModule::create_collection(161 origin2.clone(),162 col_name1.clone(),163 col_desc1.clone(),164 token_prefix1.clone(),165 size166 ));167 assert_ok!(TemplateModule::create_collection(168 origin3.clone(),169 col_name1.clone(),170 col_desc1.clone(),171 token_prefix1.clone(),172 size173 ));174175 assert_eq!(TemplateModule::collection(1).owner, 1);176 assert_eq!(TemplateModule::collection(2).owner, 2);177 assert_eq!(TemplateModule::collection(3).owner, 3);178179 // collection admin180 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));181 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));182183 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);184 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);185 });186}187188#[test]189fn remove_collection_admin() {190 new_test_ext().execute_with(|| {191 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();192 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();193 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();194195 let size = 1024;196 let origin1 = Origin::signed(1);197 let origin2 = Origin::signed(2);198 let origin3 = Origin::signed(3);199200 assert_ok!(TemplateModule::create_collection(201 origin1.clone(),202 col_name1.clone(),203 col_desc1.clone(),204 token_prefix1.clone(),205 size206 ));207 assert_ok!(TemplateModule::create_collection(208 origin2.clone(),209 col_name1.clone(),210 col_desc1.clone(),211 token_prefix1.clone(),212 size213 ));214 assert_ok!(TemplateModule::create_collection(215 origin3.clone(),216 col_name1.clone(),217 col_desc1.clone(),218 token_prefix1.clone(),219 size220 ));221222 assert_eq!(TemplateModule::collection(1).owner, 1);223 assert_eq!(TemplateModule::collection(2).owner, 2);224 assert_eq!(TemplateModule::collection(3).owner, 3);225226 // collection admin227 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));228 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));229230 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);231 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);232233 // remove admin234 assert_ok!(TemplateModule::remove_collection_admin(235 origin2.clone(),236 1,237 3238 ));239 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);240 });241}242243#[test]244fn balance_of() {245 new_test_ext().execute_with(|| {246 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();247 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();248 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();249250 let size = 1024;251 let origin1 = Origin::signed(1);252 let origin2 = Origin::signed(2);253 let origin3 = Origin::signed(3);254255 assert_ok!(TemplateModule::create_collection(256 origin1.clone(),257 col_name1.clone(),258 col_desc1.clone(),259 token_prefix1.clone(),260 size261 ));262 assert_ok!(TemplateModule::create_collection(263 origin2.clone(),264 col_name1.clone(),265 col_desc1.clone(),266 token_prefix1.clone(),267 size268 ));269 assert_ok!(TemplateModule::create_collection(270 origin3.clone(),271 col_name1.clone(),272 col_desc1.clone(),273 token_prefix1.clone(),274 size275 ));276277 assert_eq!(TemplateModule::collection(1).owner, 1);278 assert_eq!(TemplateModule::collection(2).owner, 2);279 assert_eq!(TemplateModule::collection(3).owner, 3);280281 // check balance before282 assert_eq!(TemplateModule::balance_count((1, 1)), 0);283284 // create item285 assert_ok!(TemplateModule::create_item(286 origin1.clone(),287 1,288 [1, 1, 1].to_vec()289 ));290291 // check balance (collection with id = 1, user id = 2)292 assert_eq!(TemplateModule::balance_count((1, 1)), 1);293 assert_eq!(TemplateModule::item_id((1, 1)).owner, 1);294 });295}296297#[test]298fn transfer() {299 new_test_ext().execute_with(|| {300 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();301 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();302 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();303304 let size = 1024;305 let origin1 = Origin::signed(1);306 let origin2 = Origin::signed(2);307 let origin3 = Origin::signed(3);308309 assert_ok!(TemplateModule::create_collection(310 origin1.clone(),311 col_name1.clone(),312 col_desc1.clone(),313 token_prefix1.clone(),314 size315 ));316 assert_ok!(TemplateModule::create_collection(317 origin2.clone(),318 col_name1.clone(),319 col_desc1.clone(),320 token_prefix1.clone(),321 size322 ));323 assert_ok!(TemplateModule::create_collection(324 origin3.clone(),325 col_name1.clone(),326 col_desc1.clone(),327 token_prefix1.clone(),328 size329 ));330331 assert_eq!(TemplateModule::collection(1).owner, 1);332 assert_eq!(TemplateModule::collection(2).owner, 2);333 assert_eq!(TemplateModule::collection(3).owner, 3);334335 // create item336 assert_ok!(TemplateModule::create_item(337 origin1.clone(),338 1,339 [1, 1, 1].to_vec()340 ));341342 // transfer343 assert_ok!(TemplateModule::transfer(origin1.clone(), 1, 1, 2));344 assert_eq!(TemplateModule::item_id((1, 1)).owner, 2);345346 // balance_of check347 assert_eq!(TemplateModule::balance_count((1, 1)), 0);348 assert_eq!(TemplateModule::balance_count((1, 2)), 1);349 });350}351352#[test]353fn approve() {354 new_test_ext().execute_with(|| {355 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();356 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();357 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();358359 let size = 1024;360 let origin1 = Origin::signed(1);361 let origin2 = Origin::signed(2);362 let origin3 = Origin::signed(3);363364 assert_ok!(TemplateModule::create_collection(365 origin1.clone(),366 col_name1.clone(),367 col_desc1.clone(),368 token_prefix1.clone(),369 size370 ));371 assert_ok!(TemplateModule::create_collection(372 origin2.clone(),373 col_name1.clone(),374 col_desc1.clone(),375 token_prefix1.clone(),376 size377 ));378 assert_ok!(TemplateModule::create_collection(379 origin3.clone(),380 col_name1.clone(),381 col_desc1.clone(),382 token_prefix1.clone(),383 size384 ));385386 assert_eq!(TemplateModule::collection(1).owner, 1);387 assert_eq!(TemplateModule::collection(2).owner, 2);388 assert_eq!(TemplateModule::collection(3).owner, 3);389390 // create item391 assert_ok!(TemplateModule::create_item(392 origin1.clone(),393 1,394 [1, 1, 1].to_vec()395 ));396397 // approve398 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));399 assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);400 });401}402403#[test]404fn get_approved() {405 new_test_ext().execute_with(|| {406 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();407 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();408 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();409410 let size = 1024;411 let origin1 = Origin::signed(1);412 let origin2 = Origin::signed(2);413 let origin3 = Origin::signed(3);414415 assert_ok!(TemplateModule::create_collection(416 origin1.clone(),417 col_name1.clone(),418 col_desc1.clone(),419 token_prefix1.clone(),420 size421 ));422 assert_ok!(TemplateModule::create_collection(423 origin2.clone(),424 col_name1.clone(),425 col_desc1.clone(),426 token_prefix1.clone(),427 size428 ));429 assert_ok!(TemplateModule::create_collection(430 origin3.clone(),431 col_name1.clone(),432 col_desc1.clone(),433 token_prefix1.clone(),434 size435 ));436437 assert_eq!(TemplateModule::collection(1).owner, 1);438 assert_eq!(TemplateModule::collection(2).owner, 2);439 assert_eq!(TemplateModule::collection(3).owner, 3);440441 // create item442 assert_ok!(TemplateModule::create_item(443 origin1.clone(),444 1,445 [1, 1, 1].to_vec()446 ));447448 // approve449 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));450 assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);451 });452}453454#[test]455fn transfer_from() {456 new_test_ext().execute_with(|| {457 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();458 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();459 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();460461 let size = 1024;462 let origin1 = Origin::signed(1);463 let origin2 = Origin::signed(2);464 let origin3 = Origin::signed(3);465466 assert_ok!(TemplateModule::create_collection(467 origin1.clone(),468 col_name1.clone(),469 col_desc1.clone(),470 token_prefix1.clone(),471 size472 ));473 assert_ok!(TemplateModule::create_collection(474 origin2.clone(),475 col_name1.clone(),476 col_desc1.clone(),477 token_prefix1.clone(),478 size479 ));480 assert_ok!(TemplateModule::create_collection(481 origin3.clone(),482 col_name1.clone(),483 col_desc1.clone(),484 token_prefix1.clone(),485 size486 ));487488 assert_eq!(TemplateModule::collection(1).owner, 1);489 assert_eq!(TemplateModule::collection(2).owner, 2);490 assert_eq!(TemplateModule::collection(3).owner, 3);491492 // create item493 assert_ok!(TemplateModule::create_item(494 origin1.clone(),495 1,496 [1, 1, 1].to_vec()497 ));498499 // approve500 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));501 assert_ok!(TemplateModule::transfer_from(origin1.clone(), 1, 1, 2));502 });503}504505#[test]506fn index_list() {507 new_test_ext().execute_with(|| {508 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();509 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();510 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();511512 let size = 1024;513 let origin1 = Origin::signed(1);514 let origin2 = Origin::signed(2);515 let origin3 = Origin::signed(3);516517 assert_ok!(TemplateModule::create_collection(518 origin1.clone(),519 col_name1.clone(),520 col_desc1.clone(),521 token_prefix1.clone(),522 size523 ));524 assert_ok!(TemplateModule::create_collection(525 origin2.clone(),526 col_name1.clone(),527 col_desc1.clone(),528 token_prefix1.clone(),529 size530 ));531 assert_ok!(TemplateModule::create_collection(532 origin3.clone(),533 col_name1.clone(),534 col_desc1.clone(),535 token_prefix1.clone(),536 size537 ));538539 assert_eq!(TemplateModule::collection(1).owner, 1);540 assert_eq!(TemplateModule::collection(2).owner, 2);541 assert_eq!(TemplateModule::collection(3).owner, 3);542 // create items543 assert_ok!(TemplateModule::create_item(544 origin1.clone(),545 1,546 [1, 1, 1].to_vec()547 ));548 assert_ok!(TemplateModule::create_item(549 origin1.clone(),550 1,551 [1, 1, 2].to_vec()552 ));553 assert_ok!(TemplateModule::create_item(554 origin1.clone(),555 1,556 [1, 2, 3].to_vec()557 ));558 assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 3);559 // burn one560 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 2));561 assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 2);562 // burn another one563 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 3));564 assert_eq!(TemplateModule::address_tokens((1, 1))[0], 1);565 });566}1// Tests to be written here2use crate::mock::*;3use crate::{CollectionMode, Ownership};4use frame_support::{assert_noop, assert_ok};56#[test]7fn create_nft_item() {8 new_test_ext().execute_with(|| {9 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();10 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();11 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();12 let mode: CollectionMode = CollectionMode::NFT(2000);1314 let origin1 = Origin::signed(1);15 assert_ok!(TemplateModule::create_collection(16 origin1.clone(),17 col_name1.clone(),18 col_desc1.clone(),19 token_prefix1.clone(),20 mode21 ));22 assert_eq!(TemplateModule::collection(1).owner, 1);232425 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));26 assert_eq!(TemplateModule::nft_item_id(1,1).data, [1,2,3].to_vec());27 });28}2930#[test]31fn create_refungible_item() {32 new_test_ext().execute_with(|| {33 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();34 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();35 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();36 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);3738 let origin1 = Origin::signed(1);39 assert_ok!(TemplateModule::create_collection(40 origin1.clone(),41 col_name1.clone(),42 col_desc1.clone(),43 token_prefix1.clone(),44 mode45 ));46 assert_eq!(TemplateModule::collection(1).owner, 1);474849 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));50 assert_eq!(TemplateModule::refungible_item_id(1,1).data, [1,2,3].to_vec());51 assert_eq!(TemplateModule::refungible_item_id(1,1).owner[0], Ownership { owner: 1, fraction: 1000 });52 });53}5455#[test]56fn transfer_refungible_item() {57 new_test_ext().execute_with(|| {58 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();59 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();60 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();61 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);6263 let origin1 = Origin::signed(1);64 let origin2 = Origin::signed(2);65 assert_ok!(TemplateModule::create_collection(66 origin1.clone(),67 col_name1.clone(),68 col_desc1.clone(),69 token_prefix1.clone(),70 mode71 ));72 assert_eq!(TemplateModule::collection(1).owner, 1);7374 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));75 assert_eq!(TemplateModule::refungible_item_id(1,1).data, [1,2,3].to_vec());76 assert_eq!(TemplateModule::refungible_item_id(1,1).owner[0], Ownership { owner: 1, fraction: 1000 });77 assert_eq!(TemplateModule::balance_count(1,1), 1000);78 assert_eq!(TemplateModule::address_tokens(1,1), [1]);7980 // change owner scenario81 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));82 assert_eq!(TemplateModule::refungible_item_id(1,1).owner[0], Ownership { owner: 2, fraction: 1000 });83 assert_eq!(TemplateModule::balance_count(1,1), 0);84 assert_eq!(TemplateModule::balance_count(1,2), 1000);85 assert_eq!(TemplateModule::address_tokens(1,1), []);86 assert_eq!(TemplateModule::address_tokens(1,2), [1]);8788 // split item scenario89 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));90 assert_eq!(TemplateModule::refungible_item_id(1,1).owner[0], Ownership { owner: 2, fraction: 500 });91 assert_eq!(TemplateModule::refungible_item_id(1,1).owner[1], Ownership { owner: 3, fraction: 500 });92 assert_eq!(TemplateModule::balance_count(1,2), 500);93 assert_eq!(TemplateModule::balance_count(1,3), 500);94 assert_eq!(TemplateModule::address_tokens(1,2), [1]);95 assert_eq!(TemplateModule::address_tokens(1,3), [1]);9697 // split item and new owner has account scenario98 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));99 assert_eq!(TemplateModule::refungible_item_id(1,1).owner[0], Ownership { owner: 2, fraction: 300 });100 assert_eq!(TemplateModule::refungible_item_id(1,1).owner[1], Ownership { owner: 3, fraction: 700 });101 assert_eq!(TemplateModule::balance_count(1,2), 300);102 assert_eq!(TemplateModule::balance_count(1,3), 700);103 assert_eq!(TemplateModule::address_tokens(1,2), [1]);104 assert_eq!(TemplateModule::address_tokens(1,3), [1]);105 });106}107108109#[test]110fn transfer_nft_item() {111 new_test_ext().execute_with(|| {112 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();113 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();114 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();115 let mode: CollectionMode = CollectionMode::NFT(2000);116117 let origin1 = Origin::signed(1);118 assert_ok!(TemplateModule::create_collection(119 origin1.clone(),120 col_name1.clone(),121 col_desc1.clone(),122 token_prefix1.clone(),123 mode124 ));125 assert_eq!(TemplateModule::collection(1).owner, 1);126127128 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));129 assert_eq!(TemplateModule::nft_item_id(1,1).data, [1,2,3].to_vec());130 assert_eq!(TemplateModule::balance_count(1,1), 1);131 assert_eq!(TemplateModule::address_tokens(1,1), [1]);132133 // default scenario134 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));135 assert_eq!(TemplateModule::nft_item_id(1,1).owner, 2);136 assert_eq!(TemplateModule::balance_count(1,1), 0);137 assert_eq!(TemplateModule::balance_count(1,2), 1);138 assert_eq!(TemplateModule::address_tokens(1,1), []);139 assert_eq!(TemplateModule::address_tokens(1,2), [1]); 140 });141}142143144// #[test]145// fn create_collection_test() {146// new_test_ext().execute_with(|| {147// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();148// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();149// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();150151// let size = 1024;152// let origin1 = Origin::signed(1);153// assert_ok!(TemplateModule::create_collection(154// origin1.clone(),155// col_name1.clone(),156// col_desc1.clone(),157// token_prefix1.clone(),158// size159// ));160// assert_eq!(TemplateModule::collection(1).owner, 1);161// });162// }163164// #[test]165// fn change_collection_owner() {166// new_test_ext().execute_with(|| {167// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();168// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();169// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();170171// let size = 1024;172// let origin1 = Origin::signed(1);173174// assert_ok!(TemplateModule::create_collection(175// origin1.clone(),176// col_name1.clone(),177// col_desc1.clone(),178// token_prefix1.clone(),179// size180// ));181// assert_ok!(TemplateModule::change_collection_owner(182// origin1.clone(),183// 1,184// 2185// ));186// assert_eq!(TemplateModule::collection(1).owner, 2);187// });188// }189190// #[test]191// fn destroy_collection() {192// new_test_ext().execute_with(|| {193// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();194// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();195// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();196197// let size = 1024;198// let origin1 = Origin::signed(1);199200// assert_ok!(TemplateModule::create_collection(201// origin1.clone(),202// col_name1.clone(),203// col_desc1.clone(),204// token_prefix1.clone(),205// size206// ));207// assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));208// });209// }210211// #[test]212// fn create_item() {213// new_test_ext().execute_with(|| {214// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();215// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();216// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();217218// let size = 1024;219// let origin1 = Origin::signed(1);220// let origin2 = Origin::signed(2);221222// assert_ok!(TemplateModule::create_collection(223// origin1.clone(),224// col_name1.clone(),225// col_desc1.clone(),226// token_prefix1.clone(),227// size228// ));229// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));230// assert_ok!(TemplateModule::create_item(231// origin2.clone(),232// 1,233// [1, 1, 1].to_vec()234// ));235236// // check balance (collection with id = 1, user id = 2)237// assert_eq!(TemplateModule::balance_count((1, 2)), 1);238// });239// }240241// #[test]242// fn burn_item() {243// new_test_ext().execute_with(|| {244// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();245// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();246// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();247248// let size = 1024;249// let origin1 = Origin::signed(1);250// let origin2 = Origin::signed(2);251252// assert_ok!(TemplateModule::create_collection(253// origin1.clone(),254// col_name1.clone(),255// col_desc1.clone(),256// token_prefix1.clone(),257// size258// ));259// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));260// assert_ok!(TemplateModule::create_item(261// origin2.clone(),262// 1,263// [1, 1, 1].to_vec()264// ));265266// // check balance (collection with id = 1, user id = 2)267// assert_eq!(TemplateModule::balance_count((1, 2)), 1);268269// // burn item270// assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));271// assert_noop!(272// TemplateModule::burn_item(origin1.clone(), 1, 1),273// "Item does not exists"274// );275276// assert_eq!(TemplateModule::balance_count((1, 1)), 0);277// });278// }279280// #[test]281// fn add_collection_admin() {282// new_test_ext().execute_with(|| {283// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();284// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();285// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();286287// let size = 1024;288// let origin1 = Origin::signed(1);289// let origin2 = Origin::signed(2);290// let origin3 = Origin::signed(3);291292// assert_ok!(TemplateModule::create_collection(293// origin1.clone(),294// col_name1.clone(),295// col_desc1.clone(),296// token_prefix1.clone(),297// size298// ));299// assert_ok!(TemplateModule::create_collection(300// origin2.clone(),301// col_name1.clone(),302// col_desc1.clone(),303// token_prefix1.clone(),304// size305// ));306// assert_ok!(TemplateModule::create_collection(307// origin3.clone(),308// col_name1.clone(),309// col_desc1.clone(),310// token_prefix1.clone(),311// size312// ));313314// assert_eq!(TemplateModule::collection(1).owner, 1);315// assert_eq!(TemplateModule::collection(2).owner, 2);316// assert_eq!(TemplateModule::collection(3).owner, 3);317318// // collection admin319// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));320// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));321322// assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);323// assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);324// });325// }326327// #[test]328// fn remove_collection_admin() {329// new_test_ext().execute_with(|| {330// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();331// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();332// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();333334// let size = 1024;335// let origin1 = Origin::signed(1);336// let origin2 = Origin::signed(2);337// let origin3 = Origin::signed(3);338339// assert_ok!(TemplateModule::create_collection(340// origin1.clone(),341// col_name1.clone(),342// col_desc1.clone(),343// token_prefix1.clone(),344// size345// ));346// assert_ok!(TemplateModule::create_collection(347// origin2.clone(),348// col_name1.clone(),349// col_desc1.clone(),350// token_prefix1.clone(),351// size352// ));353// assert_ok!(TemplateModule::create_collection(354// origin3.clone(),355// col_name1.clone(),356// col_desc1.clone(),357// token_prefix1.clone(),358// size359// ));360361// assert_eq!(TemplateModule::collection(1).owner, 1);362// assert_eq!(TemplateModule::collection(2).owner, 2);363// assert_eq!(TemplateModule::collection(3).owner, 3);364365// // collection admin366// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));367// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));368369// assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);370// assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);371372// // remove admin373// assert_ok!(TemplateModule::remove_collection_admin(374// origin2.clone(),375// 1,376// 3377// ));378// assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);379// });380// }381382// #[test]383// fn balance_of() {384// new_test_ext().execute_with(|| {385// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();386// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();387// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();388389// let size = 1024;390// let origin1 = Origin::signed(1);391// let origin2 = Origin::signed(2);392// let origin3 = Origin::signed(3);393394// assert_ok!(TemplateModule::create_collection(395// origin1.clone(),396// col_name1.clone(),397// col_desc1.clone(),398// token_prefix1.clone(),399// size400// ));401// assert_ok!(TemplateModule::create_collection(402// origin2.clone(),403// col_name1.clone(),404// col_desc1.clone(),405// token_prefix1.clone(),406// size407// ));408// assert_ok!(TemplateModule::create_collection(409// origin3.clone(),410// col_name1.clone(),411// col_desc1.clone(),412// token_prefix1.clone(),413// size414// ));415416// assert_eq!(TemplateModule::collection(1).owner, 1);417// assert_eq!(TemplateModule::collection(2).owner, 2);418// assert_eq!(TemplateModule::collection(3).owner, 3);419420// // check balance before421// assert_eq!(TemplateModule::balance_count((1, 1)), 0);422423// // create item424// assert_ok!(TemplateModule::create_item(425// origin1.clone(),426// 1,427// [1, 1, 1].to_vec()428// ));429430// // check balance (collection with id = 1, user id = 2)431// assert_eq!(TemplateModule::balance_count((1, 1)), 1);432// assert_eq!(TemplateModule::item_id((1, 1)).owner, 1);433// });434// }435436// #[test]437// fn transfer() {438// new_test_ext().execute_with(|| {439// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();440// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();441// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();442443// let size = 1024;444// let origin1 = Origin::signed(1);445// let origin2 = Origin::signed(2);446// let origin3 = Origin::signed(3);447448// assert_ok!(TemplateModule::create_collection(449// origin1.clone(),450// col_name1.clone(),451// col_desc1.clone(),452// token_prefix1.clone(),453// size454// ));455// assert_ok!(TemplateModule::create_collection(456// origin2.clone(),457// col_name1.clone(),458// col_desc1.clone(),459// token_prefix1.clone(),460// size461// ));462// assert_ok!(TemplateModule::create_collection(463// origin3.clone(),464// col_name1.clone(),465// col_desc1.clone(),466// token_prefix1.clone(),467// size468// ));469470// assert_eq!(TemplateModule::collection(1).owner, 1);471// assert_eq!(TemplateModule::collection(2).owner, 2);472// assert_eq!(TemplateModule::collection(3).owner, 3);473474// // create item475// assert_ok!(TemplateModule::create_item(476// origin1.clone(),477// 1,478// [1, 1, 1].to_vec()479// ));480481// // transfer482// assert_ok!(TemplateModule::transfer(origin1.clone(), 1, 1, 2));483// assert_eq!(TemplateModule::item_id((1, 1)).owner, 2);484485// // balance_of check486// assert_eq!(TemplateModule::balance_count((1, 1)), 0);487// assert_eq!(TemplateModule::balance_count((1, 2)), 1);488// });489// }490491// #[test]492// fn approve() {493// new_test_ext().execute_with(|| {494// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();495// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();496// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();497498// let size = 1024;499// let origin1 = Origin::signed(1);500// let origin2 = Origin::signed(2);501// let origin3 = Origin::signed(3);502503// assert_ok!(TemplateModule::create_collection(504// origin1.clone(),505// col_name1.clone(),506// col_desc1.clone(),507// token_prefix1.clone(),508// size509// ));510// assert_ok!(TemplateModule::create_collection(511// origin2.clone(),512// col_name1.clone(),513// col_desc1.clone(),514// token_prefix1.clone(),515// size516// ));517// assert_ok!(TemplateModule::create_collection(518// origin3.clone(),519// col_name1.clone(),520// col_desc1.clone(),521// token_prefix1.clone(),522// size523// ));524525// assert_eq!(TemplateModule::collection(1).owner, 1);526// assert_eq!(TemplateModule::collection(2).owner, 2);527// assert_eq!(TemplateModule::collection(3).owner, 3);528529// // create item530// assert_ok!(TemplateModule::create_item(531// origin1.clone(),532// 1,533// [1, 1, 1].to_vec()534// ));535536// // approve537// assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));538// assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);539// });540// }541542// #[test]543// fn get_approved() {544// new_test_ext().execute_with(|| {545// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();546// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();547// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();548549// let size = 1024;550// let origin1 = Origin::signed(1);551// let origin2 = Origin::signed(2);552// let origin3 = Origin::signed(3);553554// assert_ok!(TemplateModule::create_collection(555// origin1.clone(),556// col_name1.clone(),557// col_desc1.clone(),558// token_prefix1.clone(),559// size560// ));561// assert_ok!(TemplateModule::create_collection(562// origin2.clone(),563// col_name1.clone(),564// col_desc1.clone(),565// token_prefix1.clone(),566// size567// ));568// assert_ok!(TemplateModule::create_collection(569// origin3.clone(),570// col_name1.clone(),571// col_desc1.clone(),572// token_prefix1.clone(),573// size574// ));575576// assert_eq!(TemplateModule::collection(1).owner, 1);577// assert_eq!(TemplateModule::collection(2).owner, 2);578// assert_eq!(TemplateModule::collection(3).owner, 3);579580// // create item581// assert_ok!(TemplateModule::create_item(582// origin1.clone(),583// 1,584// [1, 1, 1].to_vec()585// ));586587// // approve588// assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));589// assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);590// });591// }592593// #[test]594// fn transfer_from() {595// new_test_ext().execute_with(|| {596// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();597// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();598// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();599600// let size = 1024;601// let origin1 = Origin::signed(1);602// let origin2 = Origin::signed(2);603// let origin3 = Origin::signed(3);604605// assert_ok!(TemplateModule::create_collection(606// origin1.clone(),607// col_name1.clone(),608// col_desc1.clone(),609// token_prefix1.clone(),610// size611// ));612// assert_ok!(TemplateModule::create_collection(613// origin2.clone(),614// col_name1.clone(),615// col_desc1.clone(),616// token_prefix1.clone(),617// size618// ));619// assert_ok!(TemplateModule::create_collection(620// origin3.clone(),621// col_name1.clone(),622// col_desc1.clone(),623// token_prefix1.clone(),624// size625// ));626627// assert_eq!(TemplateModule::collection(1).owner, 1);628// assert_eq!(TemplateModule::collection(2).owner, 2);629// assert_eq!(TemplateModule::collection(3).owner, 3);630631// // create item632// assert_ok!(TemplateModule::create_item(633// origin1.clone(),634// 1,635// [1, 1, 1].to_vec()636// ));637638// // approve639// assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));640// assert_ok!(TemplateModule::transfer_from(origin1.clone(), 1, 1, 2));641// });642// }643644// #[test]645// fn index_list() {646// new_test_ext().execute_with(|| {647// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();648// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();649// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();650651// let size = 1024;652// let origin1 = Origin::signed(1);653// let origin2 = Origin::signed(2);654// let origin3 = Origin::signed(3);655656// assert_ok!(TemplateModule::create_collection(657// origin1.clone(),658// col_name1.clone(),659// col_desc1.clone(),660// token_prefix1.clone(),661// size662// ));663// assert_ok!(TemplateModule::create_collection(664// origin2.clone(),665// col_name1.clone(),666// col_desc1.clone(),667// token_prefix1.clone(),668// size669// ));670// assert_ok!(TemplateModule::create_collection(671// origin3.clone(),672// col_name1.clone(),673// col_desc1.clone(),674// token_prefix1.clone(),675// size676// ));677678// assert_eq!(TemplateModule::collection(1).owner, 1);679// assert_eq!(TemplateModule::collection(2).owner, 2);680// assert_eq!(TemplateModule::collection(3).owner, 3);681// // create items682// assert_ok!(TemplateModule::create_item(683// origin1.clone(),684// 1,685// [1, 1, 1].to_vec()686// ));687// assert_ok!(TemplateModule::create_item(688// origin1.clone(),689// 1,690// [1, 1, 2].to_vec()691// ));692// assert_ok!(TemplateModule::create_item(693// origin1.clone(),694// 1,695// [1, 2, 3].to_vec()696// ));697// assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 3);698// // burn one699// assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 2));700// assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 2);701// // burn another one702// assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 3));703// assert_eq!(TemplateModule::address_tokens((1, 1))[0], 1);704// });705// }