git.delta.rocks / unique-network / refs/commits / 1284e5a1615c

difftreelog

feat limit allowance to owned amount

Yaroslav Bolyukin2021-02-17parent: #a09692c.patch.diff
in: master

1 file changed

modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
348 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 approve
352 CantAfford,
351 /// No approve found353 /// No approve found
352 ApproveNotFound,354 ApproveNotFound,
353 /// Requested value more than approved.355 /// Requested value more than approved.
10831085
1084 // Transfer permissions check1086 // Transfer permissions check
1085 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 None
1087 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 };
10891102
1090 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);
11011117
1102 Ok(())1118 Ok(())
1866 Ok(())1882 Ok(())
1867 }1883 }
1884
1885 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);
1891
1892 match target_collection.mode {
1893 CollectionMode::NFT => {
1894 if <NftItemList<T>>::get(collection_id, item_id).owner == subject {
1895 return Some(1)
1896 }
1897 None
1898 },
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 None
1905 },
1906 CollectionMode::ReFungible => <ReFungibleItemList<T>>::get(collection_id, item_id)
1907 .owner
1908 .iter()
1909 .find(|i| i.owner == subject)
1910 .map(|i| i.fraction),
1911 CollectionMode::Invalid => None,
1912 }
1913 }
18681914
1869 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);