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

difftreelog

Merge pull request #23 from usetech-llc/feature/nftpar-184

Greg Zaitsev2020-12-01parents: #108965f #7994cd9.patch.diff
in: master
Errors messages

1 file changed

modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
88
9use codec::{Decode, Encode};9use codec::{Decode, Encode};
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, decl_error,
12 dispatch::DispatchResult,12 dispatch::DispatchResult,
13 ensure, fail, parameter_types,13 ensure, fail, parameter_types,
14 traits::{14 traits::{
261}261}
262
263
264decl_error! {
265 /// Error for non-fungible-token module.
266 pub enum Error for Module<T: Trait> {
267 /// Total collections bound exceeded
268 TotalCollectionsLimitExceeded,
269 /// Decimal_points parameter must be lower than 4
270 CollectionDecimalPointLimitExceeded,
271 /// Collection name can not be longer than 63 char
272 CollectionNameLimitExceeded,
273 /// Collection description can not be longer than 255 char
274 CollectionDescriptionLimitExceeded,
275 /// Token prefix can not be longer than 15 char
276 CollectionTokenPrefixLimitExceeded,
277 /// This collection does not exist
278 CollectionNotFound,
279 /// Item not exists
280 TokenNotFound,
281 /// Arithmetic calculation overflow
282 NumOverflow,
283 /// Account already has admin role
284 AlreadyAdmin,
285 /// You do not own this collection
286 NoPermission,
287 /// This address is not set as sponsor, use setCollectionSponsor first
288 ConfirmUnsetSponsorFail,
289 /// Collection is not in mint mode
290 PublicMintingNotAllowed,
291 /// Sender parameter and item owner must be equal
292 MustBeTokenOwner,
293 /// Item balance not enouth
294 TokenValueTooLow,
295 /// Size of item is too large
296 NftSizeLimitExceeded,
297 /// Size of item must be 0 with fungible type
298 FungibleUnexpectedParam,
299 /// No approve found
300 ApproveNotFound,
301 /// Requested value more than approved
302 TokenValueNotEnough,
303 /// Only approved addresses can call this method
304 ApproveRequired,
305 /// Address is not in white list
306 AddresNotInWhiteList,
307 /// Number of collection admins bound exceeded
308 CollectionAdminsLimitExceeded,
309 /// Owned tokens by a single address bound exceeded
310 AddressOwnershipLimitExceeded,
311 /// Length of items properties must be greater than 0
312 EmptyArgument,
313 }
314}
262315
263pub trait Trait: system::Trait + Sized + transaction_payment::Trait + pallet_contracts::Trait {316pub trait Trait: system::Trait + Sized + transaction_payment::Trait + pallet_contracts::Trait {
264 type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;317 type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
378 pub struct Module<T: Trait> for enum Call where origin: T::Origin {431 pub struct Module<T: Trait> for enum Call where origin: T::Origin {
379432
380 fn deposit_event() = default;433 fn deposit_event() = default;
434 type Error = Error<T>;
381435
382 fn on_initialize(now: T::BlockNumber) -> Weight {436 fn on_initialize(now: T::BlockNumber) -> Weight {
383437
424 };478 };
425479
426 // bound Total number of collections480 // bound Total number of collections
427 ensure!(CollectionCount::get() < ChainLimit::get().collection_numbers_limit, "Total collections bound exceeded");481 ensure!(CollectionCount::get() < ChainLimit::get().collection_numbers_limit, Error::<T>::TotalCollectionsLimitExceeded);
428482
429 // check params483 // check params
430 ensure!(decimal_points <= 4, "decimal_points parameter must be lower than 4");484 ensure!(decimal_points <= 4, Error::<T>::CollectionDecimalPointLimitExceeded);
431485
432 let mut name = collection_name.to_vec();486 let mut name = collection_name.to_vec();
433 name.push(0);487 name.push(0);
434 ensure!(name.len() <= 64, "Collection name can not be longer than 63 char");488 ensure!(name.len() <= 64, Error::<T>::CollectionNameLimitExceeded);
435489
436 let mut description = collection_description.to_vec();490 let mut description = collection_description.to_vec();
437 description.push(0);491 description.push(0);
438 ensure!(name.len() <= 256, "Collection description can not be longer than 255 char");492 ensure!(name.len() <= 256, Error::<T>::CollectionDescriptionLimitExceeded);
439493
440 let mut prefix = token_prefix.to_vec();494 let mut prefix = token_prefix.to_vec();
441 prefix.push(0);495 prefix.push(0);
442 ensure!(prefix.len() <= 16, "Token prefix can not be longer than 15 char");496 ensure!(prefix.len() <= 16, Error::<T>::CollectionTokenPrefixLimitExceeded);
443497
444 // Generate next collection ID498 // Generate next collection ID
445 let next_id = CreatedCollectionCount::get()499 let next_id = CreatedCollectionCount::get()
446 .checked_add(1)500 .checked_add(1)
447 .expect("collection id error");501 .ok_or(Error::<T>::NumOverflow)?;
448502
449 // bound counter503 // bound counter
450 let total = CollectionCount::get()504 let total = CollectionCount::get()
451 .checked_add(1)505 .checked_add(1)
452 .expect("collection counter error");506 .ok_or(Error::<T>::NumOverflow)?;
453507
454 CreatedCollectionCount::put(next_id);508 CreatedCollectionCount::put(next_id);
455 CollectionCount::put(total);509 CollectionCount::put(total);
516 // bound couter570 // bound couter
517 let total = CollectionCount::get()571 let total = CollectionCount::get()
518 .checked_sub(1)572 .checked_sub(1)
519 .expect("collection counter error");573 .ok_or(Error::<T>::NumOverflow)?;
520574
521 CollectionCount::put(total);575 CollectionCount::put(total);
522 }576 }
685 if <AdminList<T>>::contains_key(collection_id)739 if <AdminList<T>>::contains_key(collection_id)
686 {740 {
687 admin_arr = <AdminList<T>>::get(collection_id);741 admin_arr = <AdminList<T>>::get(collection_id);
688 ensure!(!admin_arr.contains(&new_admin_id), "Account already has admin role");742 ensure!(!admin_arr.contains(&new_admin_id), Error::<T>::AlreadyAdmin);
689 }743 }
690744
691 // Number of collection admins745 // Number of collection admins
692 ensure!((admin_arr.len() as u64) < ChainLimit::get().collections_admins_limit, "Number of collection admins bound exceeded");746 ensure!((admin_arr.len() as u64) < ChainLimit::get().collections_admins_limit, Error::<T>::CollectionAdminsLimitExceeded);
693747
694 admin_arr.push(new_admin_id);748 admin_arr.push(new_admin_id);
695 <AdminList<T>>::insert(collection_id, admin_arr);749 <AdminList<T>>::insert(collection_id, admin_arr);
738 pub fn set_collection_sponsor(origin, collection_id: u64, new_sponsor: T::AccountId) -> DispatchResult {792 pub fn set_collection_sponsor(origin, collection_id: u64, new_sponsor: T::AccountId) -> DispatchResult {
739793
740 let sender = ensure_signed(origin)?;794 let sender = ensure_signed(origin)?;
741 ensure!(<Collection<T>>::contains_key(collection_id), "This collection does not exist");795 ensure!(<Collection<T>>::contains_key(collection_id), Error::<T>::CollectionNotFound);
742796
743 let mut target_collection = <Collection<T>>::get(collection_id);797 let mut target_collection = <Collection<T>>::get(collection_id);
744 ensure!(sender == target_collection.owner, "You do not own this collection");798 ensure!(sender == target_collection.owner, Error::<T>::NoPermission);
745799
746 target_collection.unconfirmed_sponsor = new_sponsor;800 target_collection.unconfirmed_sponsor = new_sponsor;
747 <Collection<T>>::insert(collection_id, target_collection);801 <Collection<T>>::insert(collection_id, target_collection);
760 pub fn confirm_sponsorship(origin, collection_id: u64) -> DispatchResult {814 pub fn confirm_sponsorship(origin, collection_id: u64) -> DispatchResult {
761815
762 let sender = ensure_signed(origin)?;816 let sender = ensure_signed(origin)?;
763 ensure!(<Collection<T>>::contains_key(collection_id), "This collection does not exist");817 ensure!(<Collection<T>>::contains_key(collection_id), Error::<T>::CollectionNotFound);
764818
765 let mut target_collection = <Collection<T>>::get(collection_id);819 let mut target_collection = <Collection<T>>::get(collection_id);
766 ensure!(sender == target_collection.unconfirmed_sponsor, "This address is not set as sponsor, use setCollectionSponsor first");820 ensure!(sender == target_collection.unconfirmed_sponsor, Error::<T>::ConfirmUnsetSponsorFail);
767821
768 target_collection.sponsor = target_collection.unconfirmed_sponsor;822 target_collection.sponsor = target_collection.unconfirmed_sponsor;
769 target_collection.unconfirmed_sponsor = T::AccountId::default();823 target_collection.unconfirmed_sponsor = T::AccountId::default();
785 pub fn remove_collection_sponsor(origin, collection_id: u64) -> DispatchResult {839 pub fn remove_collection_sponsor(origin, collection_id: u64) -> DispatchResult {
786840
787 let sender = ensure_signed(origin)?;841 let sender = ensure_signed(origin)?;
788 ensure!(<Collection<T>>::contains_key(collection_id), "This collection does not exist");842 ensure!(<Collection<T>>::contains_key(collection_id), Error::<T>::CollectionNotFound);
789843
790 let mut target_collection = <Collection<T>>::get(collection_id);844 let mut target_collection = <Collection<T>>::get(collection_id);
791 ensure!(sender == target_collection.owner, "You do not own this collection");845 ensure!(sender == target_collection.owner, Error::<T>::NoPermission);
792846
793 target_collection.sponsor = T::AccountId::default();847 target_collection.sponsor = T::AccountId::default();
794 <Collection<T>>::insert(collection_id, target_collection);848 <Collection<T>>::insert(collection_id, target_collection);
859 .sum())]913 .sum())]
860 pub fn create_multiple_items(origin, collection_id: u64, owner: T::AccountId, items_data: Vec<CreateItemData>) -> DispatchResult {914 pub fn create_multiple_items(origin, collection_id: u64, owner: T::AccountId, items_data: Vec<CreateItemData>) -> DispatchResult {
861915
862 ensure!(items_data.len() > 0, "Length of items properties must be greater than 0.");916 ensure!(items_data.len() > 0, Error::<T>::EmptyArgument);
863 let sender = ensure_signed(origin)?;917 let sender = ensure_signed(origin)?;
864918
865 Self::collection_exists(collection_id)?;919 Self::collection_exists(collection_id)?;
900 let target_collection = <Collection<T>>::get(collection_id);954 let target_collection = <Collection<T>>::get(collection_id);
901 ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) ||955 ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) ||
902 Self::is_owner_or_admin_permissions(collection_id, sender.clone()),956 Self::is_owner_or_admin_permissions(collection_id, sender.clone()),
903 "Only item owner, collection owner and admins can modify item");957 Error::<T>::NoPermission);
904958
905 if target_collection.access == AccessMode::WhiteList {959 if target_collection.access == AccessMode::WhiteList {
906 Self::check_white_list(collection_id, &sender)?;960 Self::check_white_list(collection_id, &sender)?;
952 let target_collection = <Collection<T>>::get(collection_id);1006 let target_collection = <Collection<T>>::get(collection_id);
953 ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) ||1007 ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) ||
954 Self::is_owner_or_admin_permissions(collection_id, sender.clone()),1008 Self::is_owner_or_admin_permissions(collection_id, sender.clone()),
955 "Only item owner, collection owner and admins can modify item");1009 Error::<T>::NoPermission);
9561010
957 if target_collection.access == AccessMode::WhiteList {1011 if target_collection.access == AccessMode::WhiteList {
958 Self::check_white_list(collection_id, &sender)?;1012 Self::check_white_list(collection_id, &sender)?;
994 let target_collection = <Collection<T>>::get(collection_id);1048 let target_collection = <Collection<T>>::get(collection_id);
995 ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) ||1049 ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) ||
996 Self::is_owner_or_admin_permissions(collection_id, sender.clone()),1050 Self::is_owner_or_admin_permissions(collection_id, sender.clone()),
997 "Only item owner, collection owner and admins can approve");1051 Error::<T>::NoPermission);
9981052
999 if target_collection.access == AccessMode::WhiteList {1053 if target_collection.access == AccessMode::WhiteList {
1000 Self::check_white_list(collection_id, &sender)?;1054 Self::check_white_list(collection_id, &sender)?;
1056 if opt_item.is_some()1110 if opt_item.is_some()
1057 {1111 {
1058 appoved_transfer = true;1112 appoved_transfer = true;
1059 ensure!(opt_item.unwrap().amount >= value, "Requested value more than approved");1113 ensure!(opt_item.unwrap().amount >= value, Error::<T>::TokenValueNotEnough);
1060 }1114 }
1061 }1115 }
10621116
1063 // Transfer permissions check1117 // Transfer permissions check
1064 let target_collection = <Collection<T>>::get(collection_id);1118 let target_collection = <Collection<T>>::get(collection_id);
1065 ensure!(appoved_transfer || Self::is_owner_or_admin_permissions(collection_id, sender.clone()),1119 ensure!(appoved_transfer || Self::is_owner_or_admin_permissions(collection_id, sender.clone()),
1066 "Only item owner, collection owner and admins can modify items");1120 Error::<T>::NoPermission);
10671121
1068 if target_collection.access == AccessMode::WhiteList {1122 if target_collection.access == AccessMode::WhiteList {
1069 Self::check_white_list(collection_id, &sender)?;1123 Self::check_white_list(collection_id, &sender)?;
1130 let target_collection = <Collection<T>>::get(collection_id);1184 let target_collection = <Collection<T>>::get(collection_id);
1131 ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) ||1185 ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) ||
1132 Self::is_owner_or_admin_permissions(collection_id, sender.clone()),1186 Self::is_owner_or_admin_permissions(collection_id, sender.clone()),
1133 "Only item owner, collection owner and admins can modify item");1187 Error::<T>::NoPermission);
11341188
1135 Self::item_exists(collection_id, item_id, &target_collection.mode)?;1189 Self::item_exists(collection_id, item_id, &target_collection.mode)?;
11361190
1263 let owner = <ContractOwner<T>>::get(&contract_address);1317 let owner = <ContractOwner<T>>::get(&contract_address);
1264 is_owner = sender == owner;1318 is_owner = sender == owner;
1265 }1319 }
1266 ensure!(is_owner, "Only contract owner may call this method");1320 ensure!(is_owner, Error::<T>::NoPermission);
12671321
1268 <ContractSelfSponsoring<T>>::insert(contract_address, enable);1322 <ContractSelfSponsoring<T>>::insert(contract_address, enable);
1269 Ok(())1323 Ok(())
1277 fn can_create_items_in_collection(collection_id: u64, collection: &CollectionType<T::AccountId>, sender: &T::AccountId, owner: &T::AccountId) -> DispatchResult {1331 fn can_create_items_in_collection(collection_id: u64, collection: &CollectionType<T::AccountId>, sender: &T::AccountId, owner: &T::AccountId) -> DispatchResult {
12781332
1279 if !Self::is_owner_or_admin_permissions(collection_id, sender.clone()) {1333 if !Self::is_owner_or_admin_permissions(collection_id, sender.clone()) {
1280 ensure!(collection.mint_mode == true, "Public minting is not allowed for this collection");1334 ensure!(collection.mint_mode == true, Error::<T>::PublicMintingNotAllowed);
1281 Self::check_white_list(collection_id, owner)?;1335 Self::check_white_list(collection_id, owner)?;
1282 Self::check_white_list(collection_id, sender)?;1336 Self::check_white_list(collection_id, sender)?;
1283 }1337 }
1367 fn add_fungible_item(item: FungibleItemType<T::AccountId>) -> DispatchResult {1421 fn add_fungible_item(item: FungibleItemType<T::AccountId>) -> DispatchResult {
1368 let current_index = <ItemListIndex>::get(item.collection)1422 let current_index = <ItemListIndex>::get(item.collection)
1369 .checked_add(1)1423 .checked_add(1)
1370 .expect("Item list index id error");1424 .ok_or(Error::<T>::NumOverflow)?;
1371 let itemcopy = item.clone();1425 let itemcopy = item.clone();
1372 let owner = item.owner.clone();1426 let owner = item.owner.clone();
1373 let value = item.value as u64;1427 let value = item.value as u64;
1384 // Update balance1438 // Update balance
1385 let new_balance = <Balance<T>>::get(item.collection, owner.clone())1439 let new_balance = <Balance<T>>::get(item.collection, owner.clone())
1386 .checked_add(value)1440 .checked_add(value)
1387 .unwrap();1441 .ok_or(Error::<T>::NumOverflow)?;
1388 <Balance<T>>::insert(item.collection, owner.clone(), new_balance);1442 <Balance<T>>::insert(item.collection, owner.clone(), new_balance);
13891443
1390 Ok(())1444 Ok(())
1393 fn add_refungible_item(item: ReFungibleItemType<T::AccountId>) -> DispatchResult {1447 fn add_refungible_item(item: ReFungibleItemType<T::AccountId>) -> DispatchResult {
1394 let current_index = <ItemListIndex>::get(item.collection)1448 let current_index = <ItemListIndex>::get(item.collection)
1395 .checked_add(1)1449 .checked_add(1)
1396 .expect("Item list index id error");1450 .ok_or(Error::<T>::NumOverflow)?;
1397 let itemcopy = item.clone();1451 let itemcopy = item.clone();
13981452
1399 let value = item.owner.first().unwrap().fraction as u64;1453 let value = item.owner.first().unwrap().fraction as u64;
1411 // Update balance1465 // Update balance
1412 let new_balance = <Balance<T>>::get(item.collection, owner.clone())1466 let new_balance = <Balance<T>>::get(item.collection, owner.clone())
1413 .checked_add(value)1467 .checked_add(value)
1414 .unwrap();1468 .ok_or(Error::<T>::NumOverflow)?;
1415 <Balance<T>>::insert(item.collection, owner.clone(), new_balance);1469 <Balance<T>>::insert(item.collection, owner.clone(), new_balance);
14161470
1417 Ok(())1471 Ok(())
1420 fn add_nft_item(item: NftItemType<T::AccountId>) -> DispatchResult {1474 fn add_nft_item(item: NftItemType<T::AccountId>) -> DispatchResult {
1421 let current_index = <ItemListIndex>::get(item.collection)1475 let current_index = <ItemListIndex>::get(item.collection)
1422 .checked_add(1)1476 .checked_add(1)
1423 .expect("Item list index id error");1477 .ok_or(Error::<T>::NumOverflow)?;
14241478
1425 let item_owner = item.owner.clone();1479 let item_owner = item.owner.clone();
1426 let collection_id = item.collection.clone();1480 let collection_id = item.collection.clone();
1436 // Update balance1490 // Update balance
1437 let new_balance = <Balance<T>>::get(collection_id, item_owner.clone())1491 let new_balance = <Balance<T>>::get(collection_id, item_owner.clone())
1438 .checked_add(1)1492 .checked_add(1)
1439 .unwrap();1493 .ok_or(Error::<T>::NumOverflow)?;
1440 <Balance<T>>::insert(collection_id, item_owner.clone(), new_balance);1494 <Balance<T>>::insert(collection_id, item_owner.clone(), new_balance);
14411495
1442 Ok(())1496 Ok(())
1449 ) -> DispatchResult {1503 ) -> DispatchResult {
1450 ensure!(1504 ensure!(
1451 <ReFungibleItemList<T>>::contains_key(collection_id, item_id),1505 <ReFungibleItemList<T>>::contains_key(collection_id, item_id),
1452 "Item does not exists"1506 Error::<T>::TokenNotFound
1453 );1507 );
1454 let collection = <ReFungibleItemList<T>>::get(collection_id, item_id);1508 let collection = <ReFungibleItemList<T>>::get(collection_id, item_id);
1455 let item = collection1509 let item = collection
1466 // update balance1520 // update balance
1467 let new_balance = <Balance<T>>::get(collection_id, item.owner.clone())1521 let new_balance = <Balance<T>>::get(collection_id, item.owner.clone())
1468 .checked_sub(item.fraction as u64)1522 .checked_sub(item.fraction as u64)
1469 .unwrap();1523 .ok_or(Error::<T>::NumOverflow)?;
1470 <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);1524 <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);
14711525
1472 <ReFungibleItemList<T>>::remove(collection_id, item_id);1526 <ReFungibleItemList<T>>::remove(collection_id, item_id);
1477 fn burn_nft_item(collection_id: u64, item_id: u64) -> DispatchResult {1531 fn burn_nft_item(collection_id: u64, item_id: u64) -> DispatchResult {
1478 ensure!(1532 ensure!(
1479 <NftItemList<T>>::contains_key(collection_id, item_id),1533 <NftItemList<T>>::contains_key(collection_id, item_id),
1480 "Item does not exists"1534 Error::<T>::TokenNotFound
1481 );1535 );
1482 let item = <NftItemList<T>>::get(collection_id, item_id);1536 let item = <NftItemList<T>>::get(collection_id, item_id);
1483 Self::remove_token_index(collection_id, item_id, item.owner.clone())?;1537 Self::remove_token_index(collection_id, item_id, item.owner.clone())?;
1488 // update balance1542 // update balance
1489 let new_balance = <Balance<T>>::get(collection_id, item.owner.clone())1543 let new_balance = <Balance<T>>::get(collection_id, item.owner.clone())
1490 .checked_sub(1)1544 .checked_sub(1)
1491 .unwrap();1545 .ok_or(Error::<T>::NumOverflow)?;
1492 <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);1546 <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);
1493 <NftItemList<T>>::remove(collection_id, item_id);1547 <NftItemList<T>>::remove(collection_id, item_id);
14941548
1498 fn burn_fungible_item(collection_id: u64, item_id: u64) -> DispatchResult {1552 fn burn_fungible_item(collection_id: u64, item_id: u64) -> DispatchResult {
1499 ensure!(1553 ensure!(
1500 <FungibleItemList<T>>::contains_key(collection_id, item_id),1554 <FungibleItemList<T>>::contains_key(collection_id, item_id),
1501 "Item does not exists"1555 Error::<T>::TokenNotFound
1502 );1556 );
1503 let item = <FungibleItemList<T>>::get(collection_id, item_id);1557 let item = <FungibleItemList<T>>::get(collection_id, item_id);
1504 Self::remove_token_index(collection_id, item_id, item.owner.clone())?;1558 Self::remove_token_index(collection_id, item_id, item.owner.clone())?;
1509 // update balance1563 // update balance
1510 let new_balance = <Balance<T>>::get(collection_id, item.owner.clone())1564 let new_balance = <Balance<T>>::get(collection_id, item.owner.clone())
1511 .checked_sub(item.value as u64)1565 .checked_sub(item.value as u64)
1512 .unwrap();1566 .ok_or(Error::<T>::NumOverflow)?;
1513 <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);1567 <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);
15141568
1515 <FungibleItemList<T>>::remove(collection_id, item_id);1569 <FungibleItemList<T>>::remove(collection_id, item_id);
1520 fn collection_exists(collection_id: u64) -> DispatchResult {1574 fn collection_exists(collection_id: u64) -> DispatchResult {
1521 ensure!(1575 ensure!(
1522 <Collection<T>>::contains_key(collection_id),1576 <Collection<T>>::contains_key(collection_id),
1523 "This collection does not exist"1577 Error::<T>::CollectionNotFound
1524 );1578 );
1525 Ok(())1579 Ok(())
1526 }1580 }
1531 let target_collection = <Collection<T>>::get(collection_id);1585 let target_collection = <Collection<T>>::get(collection_id);
1532 ensure!(1586 ensure!(
1533 subject == target_collection.owner,1587 subject == target_collection.owner,
1534 "You do not own this collection"1588 Error::<T>::NoPermission
1535 );1589 );
15361590
1537 Ok(())1591 Ok(())
15601614
1561 ensure!(1615 ensure!(
1562 result,1616 result,
1563 "You do not have permissions to modify this collection"1617 Error::<T>::NoPermission
1564 );1618 );
1565 Ok(())1619 Ok(())
1566 }1620 }
1586 }1640 }
15871641
1588 fn check_white_list(collection_id: u64, address: &T::AccountId) -> DispatchResult {1642 fn check_white_list(collection_id: u64, address: &T::AccountId) -> DispatchResult {
1589 let mes = "Address is not in white list";1643 let mes = Error::<T>::AddresNotInWhiteList;
1590 ensure!(<WhiteList<T>>::contains_key(collection_id), mes);1644 ensure!(<WhiteList<T>>::contains_key(collection_id), mes);
1591 let wl = <WhiteList<T>>::get(collection_id);1645 let wl = <WhiteList<T>>::get(collection_id);
1592 ensure!(wl.contains(address), mes);1646 ensure!(wl.contains(address), mes);
1603 ) -> DispatchResult {1657 ) -> DispatchResult {
1604 ensure!(1658 ensure!(
1605 <FungibleItemList<T>>::contains_key(collection_id, item_id),1659 <FungibleItemList<T>>::contains_key(collection_id, item_id),
1606 "Item not exists"1660 Error::<T>::TokenNotFound
1607 );1661 );
16081662
1609 let full_item = <FungibleItemList<T>>::get(collection_id, item_id);1663 let full_item = <FungibleItemList<T>>::get(collection_id, item_id);
1610 let amount = full_item.value;1664 let amount = full_item.value;
16111665
1612 ensure!(amount >= value.into(), "Item balance not enouth");1666 ensure!(amount >= value.into(), Error::<T>::TokenValueTooLow);
16131667
1614 // update balance1668 // update balance
1615 let balance_old_owner = <Balance<T>>::get(collection_id, owner.clone())1669 let balance_old_owner = <Balance<T>>::get(collection_id, owner.clone())
1616 .checked_sub(value)1670 .checked_sub(value)
1617 .unwrap();1671 .ok_or(Error::<T>::NumOverflow)?;
1618 <Balance<T>>::insert(collection_id, owner.clone(), balance_old_owner);1672 <Balance<T>>::insert(collection_id, owner.clone(), balance_old_owner);
16191673
1620 let mut new_owner_account_id = 0;1674 let mut new_owner_account_id = 0;
1636 // update balance1690 // update balance
1637 let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.clone())1691 let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.clone())
1638 .checked_add(value)1692 .checked_add(value)
1639 .unwrap();1693 .ok_or(Error::<T>::NumOverflow)?;
1640 <Balance<T>>::insert(collection_id, new_owner.clone(), balance_new_owner);1694 <Balance<T>>::insert(collection_id, new_owner.clone(), balance_new_owner);
16411695
1642 // update index collection1696 // update index collection
1654 // update balance1708 // update balance
1655 let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.clone())1709 let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.clone())
1656 .checked_add(value)1710 .checked_add(value)
1657 .unwrap();1711 .ok_or(Error::<T>::NumOverflow)?;
1658 <Balance<T>>::insert(collection_id, new_owner.clone(), balance_new_owner);1712 <Balance<T>>::insert(collection_id, new_owner.clone(), balance_new_owner);
16591713
1660 <FungibleItemList<T>>::insert(collection_id, new_owner_account_id, item);1714 <FungibleItemList<T>>::insert(collection_id, new_owner_account_id, item);
1692 ) -> DispatchResult {1746 ) -> DispatchResult {
1693 ensure!(1747 ensure!(
1694 <ReFungibleItemList<T>>::contains_key(collection_id, item_id),1748 <ReFungibleItemList<T>>::contains_key(collection_id, item_id),
1695 "Item not exists"1749 Error::<T>::TokenNotFound
1696 );1750 );
16971751
1698 let full_item = <ReFungibleItemList<T>>::get(collection_id, item_id);1752 let full_item = <ReFungibleItemList<T>>::get(collection_id, item_id);
1701 .iter()1755 .iter()
1702 .filter(|i| i.owner == owner)1756 .filter(|i| i.owner == owner)
1703 .next()1757 .next()
1704 .unwrap();1758 .ok_or(Error::<T>::NumOverflow)?;
1705 let amount = item.fraction;1759 let amount = item.fraction;
17061760
1707 ensure!(amount >= value.into(), "Item balance not enouth");1761 ensure!(amount >= value.into(), Error::<T>::TokenValueTooLow);
17081762
1709 // update balance1763 // update balance
1710 let balance_old_owner = <Balance<T>>::get(collection_id, item.owner.clone())1764 let balance_old_owner = <Balance<T>>::get(collection_id, item.owner.clone())
1711 .checked_sub(value)1765 .checked_sub(value)
1712 .unwrap();1766 .ok_or(Error::<T>::NumOverflow)?;
1713 <Balance<T>>::insert(collection_id, item.owner.clone(), balance_old_owner);1767 <Balance<T>>::insert(collection_id, item.owner.clone(), balance_old_owner);
17141768
1715 let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.clone())1769 let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.clone())
1716 .checked_add(value)1770 .checked_add(value)
1717 .unwrap();1771 .ok_or(Error::<T>::NumOverflow)?;
1718 <Balance<T>>::insert(collection_id, new_owner.clone(), balance_new_owner);1772 <Balance<T>>::insert(collection_id, new_owner.clone(), balance_new_owner);
17191773
1720 let old_owner = item.owner.clone();1774 let old_owner = item.owner.clone();
1777 ) -> DispatchResult {1831 ) -> DispatchResult {
1778 ensure!(1832 ensure!(
1779 <NftItemList<T>>::contains_key(collection_id, item_id),1833 <NftItemList<T>>::contains_key(collection_id, item_id),
1780 "Item not exists"1834 Error::<T>::TokenNotFound
1781 );1835 );
17821836
1783 let mut item = <NftItemList<T>>::get(collection_id, item_id);1837 let mut item = <NftItemList<T>>::get(collection_id, item_id);
17841838
1785 ensure!(1839 ensure!(
1786 sender == item.owner,1840 sender == item.owner,
1787 "sender parameter and item owner must be equal"1841 Error::<T>::MustBeTokenOwner
1788 );1842 );
17891843
1790 // update balance1844 // update balance
1791 let balance_old_owner = <Balance<T>>::get(collection_id, item.owner.clone())1845 let balance_old_owner = <Balance<T>>::get(collection_id, item.owner.clone())
1792 .checked_sub(1)1846 .checked_sub(1)
1793 .unwrap();1847 .ok_or(Error::<T>::NumOverflow)?;
1794 <Balance<T>>::insert(collection_id, item.owner.clone(), balance_old_owner);1848 <Balance<T>>::insert(collection_id, item.owner.clone(), balance_old_owner);
17951849
1796 let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.clone())1850 let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.clone())
1797 .checked_add(1)1851 .checked_add(1)
1798 .unwrap();1852 .ok_or(Error::<T>::NumOverflow)?;
1799 <Balance<T>>::insert(collection_id, new_owner.clone(), balance_new_owner);1853 <Balance<T>>::insert(collection_id, new_owner.clone(), balance_new_owner);
18001854
1801 // change owner1855 // change owner
1817 mode: &CollectionMode1871 mode: &CollectionMode
1818 ) -> DispatchResult {1872 ) -> DispatchResult {
1819 match mode {1873 match mode {
1820 CollectionMode::NFT => ensure!(<NftItemList<T>>::contains_key(collection_id, item_id), "Item does not exists"),1874 CollectionMode::NFT => ensure!(<NftItemList<T>>::contains_key(collection_id, item_id), Error::<T>::TokenNotFound),
1821 CollectionMode::ReFungible(_) => ensure!(<ReFungibleItemList<T>>::contains_key(collection_id, item_id), "Item does not exists"),1875 CollectionMode::ReFungible(_) => ensure!(<ReFungibleItemList<T>>::contains_key(collection_id, item_id), Error::<T>::TokenNotFound),
1822 CollectionMode::Fungible(_) => ensure!(<FungibleItemList<T>>::contains_key(collection_id, item_id), "Item does not exists"),1876 CollectionMode::Fungible(_) => ensure!(<FungibleItemList<T>>::contains_key(collection_id, item_id), Error::<T>::TokenNotFound),
1823 _ => ()1877 _ => ()
1824 };1878 };
1825 1879
1876 // Generate next collection ID1930 // Generate next collection ID
1877 let next_id = CreatedCollectionCount::get()1931 let next_id = CreatedCollectionCount::get()
1878 .checked_add(1)1932 .checked_add(1)
1879 .expect("collection id error");1933 .unwrap();
18801934
1881 CreatedCollectionCount::put(next_id);1935 CreatedCollectionCount::put(next_id);
1882 }1936 }
18831937
1884 fn init_nft_token(item: &NftItemType<T::AccountId>) {1938 fn init_nft_token(item: &NftItemType<T::AccountId>) {
1885 let current_index = <ItemListIndex>::get(item.collection)1939 let current_index = <ItemListIndex>::get(item.collection)
1886 .checked_add(1)1940 .checked_add(1)
1887 .expect("Item list index id error");1941 .unwrap();
18881942
1889 let item_owner = item.owner.clone();1943 let item_owner = item.owner.clone();
1890 let collection_id = item.collection.clone();1944 let collection_id = item.collection.clone();
1902 fn init_fungible_token(item: &FungibleItemType<T::AccountId>) {1956 fn init_fungible_token(item: &FungibleItemType<T::AccountId>) {
1903 let current_index = <ItemListIndex>::get(item.collection)1957 let current_index = <ItemListIndex>::get(item.collection)
1904 .checked_add(1)1958 .checked_add(1)
1905 .expect("Item list index id error");1959 .unwrap();
1906 let owner = item.owner.clone();1960 let owner = item.owner.clone();
1907 let value = item.value as u64;1961 let value = item.value as u64;
19081962
1920 fn init_refungible_token(item: &ReFungibleItemType<T::AccountId>) {1974 fn init_refungible_token(item: &ReFungibleItemType<T::AccountId>) {
1921 let current_index = <ItemListIndex>::get(item.collection)1975 let current_index = <ItemListIndex>::get(item.collection)
1922 .checked_add(1)1976 .checked_add(1)
1923 .expect("Item list index id error");1977 .unwrap();
19241978
1925 let value = item.owner.first().unwrap().fraction as u64;1979 let value = item.owner.first().unwrap().fraction as u64;
1926 let owner = item.owner.first().unwrap().owner.clone();1980 let owner = item.owner.first().unwrap().owner.clone();
19431997
1944 // bound Owned tokens by a single address1998 // bound Owned tokens by a single address
1945 let count = <AccountItemCount<T>>::get(owner.clone());1999 let count = <AccountItemCount<T>>::get(owner.clone());
1946 ensure!(count < ChainLimit::get().account_token_ownership_limit, "Owned tokens by a single address bound exceeded");2000 ensure!(count < ChainLimit::get().account_token_ownership_limit, Error::<T>::AddressOwnershipLimitExceeded);
19472001
1948 <AccountItemCount<T>>::insert(owner.clone(), 2002 <AccountItemCount<T>>::insert(owner.clone(), count
1949 count.checked_add(1).unwrap());2003 .checked_add(1)
2004 .ok_or(Error::<T>::NumOverflow)?);
1950 }2005 }
1951 else {2006 else {
1952 <AccountItemCount<T>>::insert(owner.clone(), 1);2007 <AccountItemCount<T>>::insert(owner.clone(), 1);
19802035
1981 // update counter2036 // update counter
1982 <AccountItemCount<T>>::insert(owner.clone(), 2037 <AccountItemCount<T>>::insert(owner.clone(),
1983 <AccountItemCount<T>>::get(owner.clone()).checked_sub(1).unwrap());2038 <AccountItemCount<T>>::get(owner.clone())
2039 .checked_sub(1)
2040 .ok_or(Error::<T>::NumOverflow)?);
19842041
19852042
1986 let list_exists = <AddressTokens<T>>::contains_key(collection_id, owner.clone());2043 let list_exists = <AddressTokens<T>>::contains_key(collection_id, owner.clone());