difftreelog
Merge pull request #23 from usetech-llc/feature/nftpar-184
in: master
Errors messages
1 file changed
pallets/nft/src/lib.rsdiffbeforeafterboth889use 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}262263264decl_error! {265 /// Error for non-fungible-token module.266 pub enum Error for Module<T: Trait> {267 /// Total collections bound exceeded268 TotalCollectionsLimitExceeded,269 /// Decimal_points parameter must be lower than 4270 CollectionDecimalPointLimitExceeded, 271 /// Collection name can not be longer than 63 char272 CollectionNameLimitExceeded, 273 /// Collection description can not be longer than 255 char274 CollectionDescriptionLimitExceeded, 275 /// Token prefix can not be longer than 15 char276 CollectionTokenPrefixLimitExceeded,277 /// This collection does not exist278 CollectionNotFound,279 /// Item not exists280 TokenNotFound,281 /// Arithmetic calculation overflow282 NumOverflow, 283 /// Account already has admin role284 AlreadyAdmin, 285 /// You do not own this collection286 NoPermission,287 /// This address is not set as sponsor, use setCollectionSponsor first288 ConfirmUnsetSponsorFail,289 /// Collection is not in mint mode290 PublicMintingNotAllowed,291 /// Sender parameter and item owner must be equal292 MustBeTokenOwner,293 /// Item balance not enouth294 TokenValueTooLow,295 /// Size of item is too large296 NftSizeLimitExceeded,297 /// Size of item must be 0 with fungible type298 FungibleUnexpectedParam,299 /// No approve found300 ApproveNotFound,301 /// Requested value more than approved302 TokenValueNotEnough,303 /// Only approved addresses can call this method304 ApproveRequired,305 /// Address is not in white list306 AddresNotInWhiteList,307 /// Number of collection admins bound exceeded308 CollectionAdminsLimitExceeded,309 /// Owned tokens by a single address bound exceeded310 AddressOwnershipLimitExceeded,311 /// Length of items properties must be greater than 0312 EmptyArgument,313 }314}262315263pub 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 {379432380 fn deposit_event() = default;433 fn deposit_event() = default;434 type Error = Error<T>;381435382 fn on_initialize(now: T::BlockNumber) -> Weight {436 fn on_initialize(now: T::BlockNumber) -> Weight {383437424 };478 };425479426 // bound Total number of collections480 // bound Total number of collections427 ensure!(CollectionCount::get() < ChainLimit::get().collection_numbers_limit, "Total collections bound exceeded");481 ensure!(CollectionCount::get() < ChainLimit::get().collection_numbers_limit, Error::<T>::TotalCollectionsLimitExceeded);428482429 // check params483 // check params430 ensure!(decimal_points <= 4, "decimal_points parameter must be lower than 4");484 ensure!(decimal_points <= 4, Error::<T>::CollectionDecimalPointLimitExceeded);431485432 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);435489436 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);439493440 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);443497444 // Generate next collection ID498 // Generate next collection ID445 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)?;448502449 // bound counter503 // bound counter450 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)?;453507454 CreatedCollectionCount::put(next_id);508 CreatedCollectionCount::put(next_id);455 CollectionCount::put(total);509 CollectionCount::put(total);516 // bound couter570 // bound couter517 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)?;520574521 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 }690744691 // Number of collection admins745 // Number of collection admins692 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);693747694 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 {739793740 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);742796743 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);745799746 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 {761815762 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);764818765 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);767821768 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 {786840787 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);789843790 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);792846793 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 {861915862 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)?;864918865 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);904958905 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);9561010957 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);9981052999 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 }106211161063 // Transfer permissions check1117 // Transfer permissions check1064 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);106711211068 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);113411881135 Self::item_exists(collection_id, item_id, &target_collection.mode)?;1189 Self::item_exists(collection_id, item_id, &target_collection.mode)?;113611901263 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);126713211268 <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 {127813321279 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 balance1385 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);138914431390 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();139814521399 let value = item.owner.first().unwrap().fraction as u64;1453 let value = item.owner.first().unwrap().fraction as u64;1411 // Update balance1465 // Update balance1412 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);141614701417 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)?;142414781425 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 balance1437 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);144114951442 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>::TokenNotFound1453 );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 = collection1466 // update balance1520 // update balance1467 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);147115251472 <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>::TokenNotFound1481 );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 balance1489 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);149415481498 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>::TokenNotFound1502 );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 balance1510 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);151415681515 <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>::CollectionNotFound1524 );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>::NoPermission1535 );1589 );153615901537 Ok(())1591 Ok(())156016141561 ensure!(1615 ensure!(1562 result,1616 result,1563 "You do not have permissions to modify this collection"1617 Error::<T>::NoPermission1564 );1618 );1565 Ok(())1619 Ok(())1566 }1620 }1586 }1640 }158716411588 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>::TokenNotFound1607 );1661 );160816621609 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;161116651612 ensure!(amount >= value.into(), "Item balance not enouth");1666 ensure!(amount >= value.into(), Error::<T>::TokenValueTooLow);161316671614 // update balance1668 // update balance1615 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);161916731620 let mut new_owner_account_id = 0;1674 let mut new_owner_account_id = 0;1636 // update balance1690 // update balance1637 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);164116951642 // update index collection1696 // update index collection1654 // update balance1708 // update balance1655 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);165917131660 <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>::TokenNotFound1696 );1750 );169717511698 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;170617601707 ensure!(amount >= value.into(), "Item balance not enouth");1761 ensure!(amount >= value.into(), Error::<T>::TokenValueTooLow);170817621709 // update balance1763 // update balance1710 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);171417681715 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);171917731720 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>::TokenNotFound1781 );1835 );178218361783 let mut item = <NftItemList<T>>::get(collection_id, item_id);1837 let mut item = <NftItemList<T>>::get(collection_id, item_id);178418381785 ensure!(1839 ensure!(1786 sender == item.owner,1840 sender == item.owner,1787 "sender parameter and item owner must be equal"1841 Error::<T>::MustBeTokenOwner1788 );1842 );178918431790 // update balance1844 // update balance1791 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);179518491796 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);180018541801 // change owner1855 // change owner1817 mode: &CollectionMode1871 mode: &CollectionMode1818 ) -> 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 ID1877 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();188019341881 CreatedCollectionCount::put(next_id);1935 CreatedCollectionCount::put(next_id);1882 }1936 }188319371884 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();188819421889 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;190819621920 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();192419781925 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();194319971944 // bound Owned tokens by a single address1998 // bound Owned tokens by a single address1945 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);194720011948 <AccountItemCount<T>>::insert(owner.clone(), 2002 <AccountItemCount<T>>::insert(owner.clone(), count1949 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);198020351981 // update counter2036 // update counter1982 <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)?);19842041198520421986 let list_exists = <AddressTokens<T>>::contains_key(collection_id, owner.clone());2043 let list_exists = <AddressTokens<T>>::contains_key(collection_id, owner.clone());