difftreelog
feat limit allowance to owned amount
in: master
1 file changed
pallets/nft/src/lib.rsdiffbeforeafterboth348 TokenValueTooLow,348 TokenValueTooLow,349 /// Size of item is too large.349 /// Size of item is too large.350 NftSizeLimitExceeded,350 NftSizeLimitExceeded,351 /// Owned amount is lesser than tried to approve352 CantAfford,351 /// No approve found353 /// No approve found352 ApproveNotFound,354 ApproveNotFound,353 /// Requested value more than approved.355 /// Requested value more than approved.108310851084 // Transfer permissions check1086 // Transfer permissions check1085 let target_collection = <Collection<T>>::get(collection_id);1087 let target_collection = <Collection<T>>::get(collection_id);1086 ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) ||1088 let allowance_limit = if Self::is_owner_or_admin_permissions(1089 collection_id,1090 sender.clone(),1091 ) {1092 None1087 Self::is_owner_or_admin_permissions(collection_id, sender.clone()),1093 } else if let Some(amount) = Self::owned_amount(1094 sender.clone(),1095 collection_id,1096 item_id,1097 ) {1098 Some(amount)1099 } else {1088 Error::<T>::NoPermission);1100 fail!(Error::<T>::NoPermission);1101 };108911021090 if target_collection.access == AccessMode::WhiteList {1103 if target_collection.access == AccessMode::WhiteList {1091 Self::check_white_list(collection_id, &sender)?;1104 Self::check_white_list(collection_id, &sender)?;1097 if allowance_exists {1110 if allowance_exists {1098 allowance += <Allowances<T>>::get(collection_id, (item_id, &sender, &spender));1111 allowance += <Allowances<T>>::get(collection_id, (item_id, &sender, &spender));1099 }1112 }1113 if let Some(limit) = allowance_limit {1114 ensure!(limit >= allowance, Error::<T>::CantAfford);1115 }1100 <Allowances<T>>::insert(collection_id, (item_id, sender.clone(), spender.clone()), allowance);1116 <Allowances<T>>::insert(collection_id, (item_id, sender.clone(), spender.clone()), allowance);110111171102 Ok(())1118 Ok(())1866 Ok(())1882 Ok(())1867 }1883 }18841885 fn owned_amount(1886 subject: T::AccountId,1887 collection_id: CollectionId,1888 item_id: TokenId,1889 ) -> Option<u128> {1890 let target_collection = <Collection<T>>::get(collection_id);18911892 match target_collection.mode {1893 CollectionMode::NFT => {1894 if <NftItemList<T>>::get(collection_id, item_id).owner == subject {1895 return Some(1)1896 }1897 None1898 },1899 CollectionMode::Fungible(_) => {1900 if <FungibleItemList<T>>::contains_key(collection_id, &subject) {1901 return Some(<FungibleItemList<T>>::get(collection_id, &subject)1902 .value);1903 }1904 None1905 },1906 CollectionMode::ReFungible => <ReFungibleItemList<T>>::get(collection_id, item_id)1907 .owner1908 .iter()1909 .find(|i| i.owner == subject)1910 .map(|i| i.fraction),1911 CollectionMode::Invalid => None,1912 }1913 }186819141869 fn is_item_owner(subject: T::AccountId, collection_id: CollectionId, item_id: TokenId) -> bool {1915 fn is_item_owner(subject: T::AccountId, collection_id: CollectionId, item_id: TokenId) -> bool {1870 let target_collection = <Collection<T>>::get(collection_id);1916 let target_collection = <Collection<T>>::get(collection_id);