git.delta.rocks / unique-network / refs/commits / 7e808da4a3d9

difftreelog

fix revert set_allowance

Daniel Shiposha2022-06-05parent: #e099d8f.patch.diff
in: master

8 files changed

modifiedpallets/common/src/lib.rsdiffbeforeafterboth
--- a/pallets/common/src/lib.rs
+++ b/pallets/common/src/lib.rs
@@ -1298,7 +1298,6 @@
 		spender: T::CrossAccountId,
 		token: TokenId,
 		amount: u128,
-		nesting_budget: &dyn Budget,
 	) -> DispatchResultWithPostInfo;
 	fn transfer_from(
 		&self,
modifiedpallets/fungible/src/common.rsdiffbeforeafterboth
--- a/pallets/fungible/src/common.rs
+++ b/pallets/fungible/src/common.rs
@@ -226,7 +226,6 @@
 		spender: T::CrossAccountId,
 		token: TokenId,
 		amount: u128,
-		_nesting_budget: &dyn Budget,
 	) -> DispatchResultWithPostInfo {
 		ensure!(
 			token == TokenId::default(),
modifiedpallets/nonfungible/src/common.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/common.rs
+++ b/pallets/nonfungible/src/common.rs
@@ -308,15 +308,14 @@
 		spender: T::CrossAccountId,
 		token: TokenId,
 		amount: u128,
-		nesting_budget: &dyn Budget,
 	) -> DispatchResultWithPostInfo {
 		ensure!(amount <= 1, <Error<T>>::NonfungibleItemsHaveNoAmount);
 
 		with_weight(
 			if amount == 1 {
-				<Pallet<T>>::set_allowance(self, &sender, token, Some(&spender), nesting_budget)
+				<Pallet<T>>::set_allowance(self, &sender, token, Some(&spender))
 			} else {
-				<Pallet<T>>::set_allowance(self, &sender, token, None, nesting_budget)
+				<Pallet<T>>::set_allowance(self, &sender, token, None)
 			},
 			<CommonWeights<T>>::approve(),
 		)
modifiedpallets/nonfungible/src/erc.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/erc.rs
+++ b/pallets/nonfungible/src/erc.rs
@@ -269,11 +269,8 @@
 		let caller = T::CrossAccountId::from_eth(caller);
 		let approved = T::CrossAccountId::from_eth(approved);
 		let token = token_id.try_into()?;
-		let budget = self
-			.recorder
-			.weight_calls_budget(<StructureWeight<T>>::find_parent());
 
-		<Pallet<T>>::set_allowance(self, &caller, token, Some(&approved), &budget)
+		<Pallet<T>>::set_allowance(self, &caller, token, Some(&approved))
 			.map_err(dispatch_to_evm::<T>)?;
 		Ok(())
 	}
modifiedpallets/nonfungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/lib.rs
+++ b/pallets/nonfungible/src/lib.rs
@@ -878,7 +878,6 @@
 		sender: &T::CrossAccountId,
 		token: TokenId,
 		spender: Option<&T::CrossAccountId>,
-		nesting_budget: &dyn Budget,
 	) -> DispatchResult {
 		if collection.permissions.access() == AccessMode::AllowList {
 			collection.check_allowlist(sender)?;
@@ -890,16 +889,10 @@
 		if let Some(spender) = spender {
 			<PalletCommon<T>>::ensure_correct_receiver(spender)?;
 		}
-
-		let is_owned = <PalletStructure<T>>::check_indirectly_owned(
-			sender.clone(),
-			collection.id,
-			token,
-			None,
-			nesting_budget
-		)?;
 
-		if !is_owned {
+		let token_data =
+			<TokenData<T>>::get((collection.id, token)).ok_or(<CommonError<T>>::TokenNotFound)?;
+		if &token_data.owner != sender {
 			ensure!(
 				collection.ignores_owned_amount(sender),
 				<CommonError<T>>::CantApproveMoreThanOwned
@@ -926,9 +919,6 @@
 			// `from`, `to` checked in [`transfer`]
 			collection.check_allowlist(spender)?;
 		}
-		if <Allowance<T>>::get((collection.id, token)).as_ref() == Some(spender) {
-			return Ok(());
-		}
 		if let Some(source) = T::CrossTokenAddressMapping::address_to_token(from) {
 			// TODO: should collection owner be allowed to perform this transfer?
 			ensure!(
@@ -943,6 +933,9 @@
 			);
 			return Ok(());
 		}
+		if <Allowance<T>>::get((collection.id, token)).as_ref() == Some(spender) {
+			return Ok(());
+		}
 		ensure!(
 			collection.ignores_allowance(spender),
 			<CommonError<T>>::ApprovedValueTooLow
modifiedpallets/proxy-rmrk-core/src/lib.rsdiffbeforeafterboth
--- a/pallets/proxy-rmrk-core/src/lib.rs
+++ b/pallets/proxy-rmrk-core/src/lib.rs
@@ -414,13 +414,14 @@
 					let is_approval_required = cross_sender != spender;
 
 					if is_approval_required {
-						<PalletNft<T>>::set_allowance(
-							&collection,
-							&cross_sender,
-							nft_id,
-							Some(&spender),
-							&budget
-						).map_err(Self::map_common_err_to_proxy)?;
+						// FIXME
+						// <PalletNft<T>>::set_allowance(
+						// 	&collection,
+						// 	&cross_sender,
+						// 	nft_id,
+						// 	Some(&spender),
+						// 	&budget
+						// ).map_err(Self::map_common_err_to_proxy)?;
 
 						return Ok(());
 					}
modifiedpallets/refungible/src/common.rsdiffbeforeafterboth
before · pallets/refungible/src/common.rs
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617use core::marker::PhantomData;1819use sp_std::collections::btree_map::BTreeMap;20use frame_support::{dispatch::DispatchResultWithPostInfo, ensure, fail, weights::Weight, traits::Get};21use up_data_structs::{22	CollectionId, TokenId, CreateItemExData, CreateRefungibleExData, budget::Budget, Property,23	PropertyKey, PropertyValue, PropertyKeyPermission, CreateItemData,24};25use pallet_common::{CommonCollectionOperations, CommonWeightInfo, with_weight};26use pallet_structure::Error as StructureError;27use sp_runtime::DispatchError;28use sp_std::{vec::Vec, vec};2930use crate::{31	AccountBalance, Allowance, Balance, Config, Error, Owned, Pallet, RefungibleHandle,32	SelfWeightOf, TokenData, weights::WeightInfo, TokensMinted,33};3435macro_rules! max_weight_of {36	($($method:ident ($($args:tt)*)),*) => {37		038		$(39			.max(<SelfWeightOf<T>>::$method($($args)*))40		)*41	};42}4344pub struct CommonWeights<T: Config>(PhantomData<T>);45impl<T: Config> CommonWeightInfo<T::CrossAccountId> for CommonWeights<T> {46	fn create_item() -> Weight {47		<SelfWeightOf<T>>::create_item()48	}4950	fn create_multiple_items(data: &[CreateItemData]) -> Weight {51		<SelfWeightOf<T>>::create_multiple_items(data.len() as u32)52	}5354	fn create_multiple_items_ex(call: &CreateItemExData<T::CrossAccountId>) -> Weight {55		match call {56			CreateItemExData::RefungibleMultipleOwners(i) => {57				<SelfWeightOf<T>>::create_multiple_items_ex_multiple_owners(i.users.len() as u32)58			}59			CreateItemExData::RefungibleMultipleItems(i) => {60				<SelfWeightOf<T>>::create_multiple_items_ex_multiple_items(i.len() as u32)61			}62			_ => 0,63		}64	}6566	fn burn_item() -> Weight {67		max_weight_of!(burn_item_partial(), burn_item_fully())68	}6970	fn set_collection_properties(_amount: u32) -> Weight {71		// Error72		073	}7475	fn delete_collection_properties(_amount: u32) -> Weight {76		// Error77		078	}7980	fn set_token_properties(amount: u32) -> Weight {81		<SelfWeightOf<T>>::set_token_properties(amount)82	}8384	fn delete_token_properties(amount: u32) -> Weight {85		<SelfWeightOf<T>>::delete_token_properties(amount)86	}8788	fn set_property_permissions(amount: u32) -> Weight {89		<SelfWeightOf<T>>::set_property_permissions(amount)90	}9192	fn transfer() -> Weight {93		max_weight_of!(94			transfer_normal(),95			transfer_creating(),96			transfer_removing(),97			transfer_creating_removing()98		)99	}100101	fn approve() -> Weight {102		<SelfWeightOf<T>>::approve()103	}104105	fn transfer_from() -> Weight {106		max_weight_of!(107			transfer_from_normal(),108			transfer_from_creating(),109			transfer_from_removing(),110			transfer_from_creating_removing()111		)112	}113114	fn burn_from() -> Weight {115		<SelfWeightOf<T>>::burn_from()116	}117118	fn burn_recursively_self_raw() -> Weight {119		// Read to get total balance120		Self::burn_item() + T::DbWeight::get().reads(1)121	}122	fn burn_recursively_breadth_raw(_amount: u32) -> Weight {123		// Refungible token can't have children124		0125	}126}127128fn map_create_data<T: Config>(129	data: up_data_structs::CreateItemData,130	to: &T::CrossAccountId,131) -> Result<CreateRefungibleExData<T::CrossAccountId>, DispatchError> {132	match data {133		up_data_structs::CreateItemData::ReFungible(data) => Ok(CreateRefungibleExData {134			const_data: data.const_data,135			users: {136				let mut out = BTreeMap::new();137				out.insert(to.clone(), data.pieces);138				out.try_into().expect("limit > 0")139			},140		}),141		_ => fail!(<Error<T>>::NotRefungibleDataUsedToMintFungibleCollectionToken),142	}143}144145impl<T: Config> CommonCollectionOperations<T> for RefungibleHandle<T> {146	fn create_item(147		&self,148		sender: T::CrossAccountId,149		to: T::CrossAccountId,150		data: up_data_structs::CreateItemData,151		nesting_budget: &dyn Budget,152	) -> DispatchResultWithPostInfo {153		with_weight(154			<Pallet<T>>::create_item(155				self,156				&sender,157				map_create_data::<T>(data, &to)?,158				nesting_budget,159			),160			<CommonWeights<T>>::create_item(),161		)162	}163164	fn create_multiple_items(165		&self,166		sender: T::CrossAccountId,167		to: T::CrossAccountId,168		data: Vec<up_data_structs::CreateItemData>,169		nesting_budget: &dyn Budget,170	) -> DispatchResultWithPostInfo {171		let weight = <CommonWeights<T>>::create_multiple_items(&data);172		let data = data173			.into_iter()174			.map(|d| map_create_data::<T>(d, &to))175			.collect::<Result<Vec<_>, DispatchError>>()?;176177		with_weight(178			<Pallet<T>>::create_multiple_items(self, &sender, data, nesting_budget),179			weight,180		)181	}182183	fn create_multiple_items_ex(184		&self,185		sender: <T>::CrossAccountId,186		data: CreateItemExData<T::CrossAccountId>,187		nesting_budget: &dyn Budget,188	) -> DispatchResultWithPostInfo {189		let weight = <CommonWeights<T>>::create_multiple_items_ex(&data);190		let data = match data {191			CreateItemExData::RefungibleMultipleOwners(r) => vec![r],192			CreateItemExData::RefungibleMultipleItems(r)193				if r.iter().all(|i| i.users.len() == 1) =>194			{195				r.into_inner()196			}197			_ => fail!(<Error<T>>::NotRefungibleDataUsedToMintFungibleCollectionToken),198		};199200		with_weight(201			<Pallet<T>>::create_multiple_items(self, &sender, data, nesting_budget),202			weight,203		)204	}205206	fn burn_item(207		&self,208		sender: T::CrossAccountId,209		token: TokenId,210		amount: u128,211	) -> DispatchResultWithPostInfo {212		with_weight(213			<Pallet<T>>::burn(self, &sender, token, amount),214			<CommonWeights<T>>::burn_item(),215		)216	}217218	fn burn_item_recursively(219		&self,220		sender: T::CrossAccountId,221		token: TokenId,222		self_budget: &dyn Budget,223		_breadth_budget: &dyn Budget,224	) -> DispatchResultWithPostInfo {225		ensure!(self_budget.consume(), <StructureError<T>>::DepthLimit,);226		with_weight(227			<Pallet<T>>::burn(228				self,229				&sender,230				token,231				<Balance<T>>::get((self.id, token, &sender)),232			),233			<CommonWeights<T>>::burn_recursively_self_raw(),234		)235	}236237	fn transfer(238		&self,239		from: T::CrossAccountId,240		to: T::CrossAccountId,241		token: TokenId,242		amount: u128,243		nesting_budget: &dyn Budget,244	) -> DispatchResultWithPostInfo {245		with_weight(246			<Pallet<T>>::transfer(self, &from, &to, token, amount, nesting_budget),247			<CommonWeights<T>>::transfer(),248		)249	}250251	fn approve(252		&self,253		sender: T::CrossAccountId,254		spender: T::CrossAccountId,255		token: TokenId,256		amount: u128,257		_nesting_budget: &dyn Budget,258	) -> DispatchResultWithPostInfo {259		with_weight(260			<Pallet<T>>::set_allowance(self, &sender, &spender, token, amount),261			<CommonWeights<T>>::approve(),262		)263	}264265	fn transfer_from(266		&self,267		sender: T::CrossAccountId,268		from: T::CrossAccountId,269		to: T::CrossAccountId,270		token: TokenId,271		amount: u128,272		nesting_budget: &dyn Budget,273	) -> DispatchResultWithPostInfo {274		with_weight(275			<Pallet<T>>::transfer_from(self, &sender, &from, &to, token, amount, nesting_budget),276			<CommonWeights<T>>::transfer_from(),277		)278	}279280	fn burn_from(281		&self,282		sender: T::CrossAccountId,283		from: T::CrossAccountId,284		token: TokenId,285		amount: u128,286		nesting_budget: &dyn Budget,287	) -> DispatchResultWithPostInfo {288		with_weight(289			<Pallet<T>>::burn_from(self, &sender, &from, token, amount, nesting_budget),290			<CommonWeights<T>>::burn_from(),291		)292	}293294	fn set_collection_properties(295		&self,296		_sender: T::CrossAccountId,297		_property: Vec<Property>,298	) -> DispatchResultWithPostInfo {299		fail!(<Error<T>>::SettingPropertiesNotAllowed)300	}301302	fn delete_collection_properties(303		&self,304		_sender: &T::CrossAccountId,305		_property_keys: Vec<PropertyKey>,306	) -> DispatchResultWithPostInfo {307		fail!(<Error<T>>::SettingPropertiesNotAllowed)308	}309310	fn set_token_properties(311		&self,312		_sender: T::CrossAccountId,313		_token_id: TokenId,314		_property: Vec<Property>,315	) -> DispatchResultWithPostInfo {316		fail!(<Error<T>>::SettingPropertiesNotAllowed)317	}318319	fn set_property_permissions(320		&self,321		_sender: &T::CrossAccountId,322		_property_permissions: Vec<PropertyKeyPermission>,323	) -> DispatchResultWithPostInfo {324		fail!(<Error<T>>::SettingPropertiesNotAllowed)325	}326327	fn delete_token_properties(328		&self,329		_sender: T::CrossAccountId,330		_token_id: TokenId,331		_property_keys: Vec<PropertyKey>,332	) -> DispatchResultWithPostInfo {333		fail!(<Error<T>>::SettingPropertiesNotAllowed)334	}335336	fn check_nesting(337		&self,338		_sender: <T>::CrossAccountId,339		_from: (CollectionId, TokenId),340		_under: TokenId,341		_budget: &dyn Budget,342	) -> sp_runtime::DispatchResult {343		fail!(<Error<T>>::RefungibleDisallowsNesting)344	}345346	fn nest(&self, _under: TokenId, _to_nest: (CollectionId, TokenId)) {}347348	fn unnest(&self, _under: TokenId, _to_nest: (CollectionId, TokenId)) {}349350	fn account_tokens(&self, account: T::CrossAccountId) -> Vec<TokenId> {351		<Owned<T>>::iter_prefix((self.id, account))352			.map(|(id, _)| id)353			.collect()354	}355356	fn collection_tokens(&self) -> Vec<TokenId> {357		<TokenData<T>>::iter_prefix((self.id,))358			.map(|(id, _)| id)359			.collect()360	}361362	fn token_exists(&self, token: TokenId) -> bool {363		<Pallet<T>>::token_exists(self, token)364	}365366	fn last_token_id(&self) -> TokenId {367		TokenId(<TokensMinted<T>>::get(self.id))368	}369370	fn token_owner(&self, _token: TokenId) -> Option<T::CrossAccountId> {371		None372	}373374	fn token_property(&self, _token_id: TokenId, _key: &PropertyKey) -> Option<PropertyValue> {375		None376	}377378	fn token_properties(379		&self,380		_token_id: TokenId,381		_keys: Option<Vec<PropertyKey>>,382	) -> Vec<Property> {383		Vec::new()384	}385386	fn total_supply(&self) -> u32 {387		<Pallet<T>>::total_supply(self)388	}389390	fn account_balance(&self, account: T::CrossAccountId) -> u32 {391		<AccountBalance<T>>::get((self.id, account))392	}393394	fn balance(&self, account: T::CrossAccountId, token: TokenId) -> u128 {395		<Balance<T>>::get((self.id, token, account))396	}397398	fn allowance(399		&self,400		sender: T::CrossAccountId,401		spender: T::CrossAccountId,402		token: TokenId,403	) -> u128 {404		<Allowance<T>>::get((self.id, token, sender, spender))405	}406}
modifiedpallets/unique/src/lib.rsdiffbeforeafterboth
--- a/pallets/unique/src/lib.rs
+++ b/pallets/unique/src/lib.rs
@@ -815,9 +815,8 @@
 		#[transactional]
 		pub fn approve(origin, spender: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, amount: u128) -> DispatchResultWithPostInfo {
 			let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
-			let budget = budget::Value::new(NESTING_BUDGET);
 
-			dispatch_call::<T, _>(collection_id, |d| d.approve(sender, spender, item_id, amount, &budget))
+			dispatch_call::<T, _>(collection_id, |d| d.approve(sender, spender, item_id, amount))
 		}
 
 		/// Change ownership of a NFT on behalf of the owner. See Approve method for additional information. After this method executes, the approval is removed so that the approved address will not be able to transfer this NFT again from this owner.