git.delta.rocks / unique-network / refs/commits / 5eadf5f526c3

difftreelog

refactor unsupported! macro

Daniel Shiposha2022-08-09parent: #24b248d.patch.diff
in: master

4 files changed

modifiedpallets/common/src/lib.rsdiffbeforeafterboth
--- a/pallets/common/src/lib.rs
+++ b/pallets/common/src/lib.rs
@@ -535,7 +535,8 @@
 
 		/// Can't transfer tokens to ethereum zero address
 		AddressIsZero,
-		/// Target collection doesn't support this operation
+
+		/// The oprtation is not supported
 		UnsupportedOperation,
 
 		/// Insufficient funds to perform an action
@@ -569,9 +570,6 @@
 
 		/// Tried to access an internal collection with an external API
 		CollectionIsInternal,
-
-		/// A method of an unsupported API was called
-		UnsupportedRuntimeApi,
 	}
 
 	/// Storage of the count of created collections. Essentially contains the last collection ID.
@@ -1356,8 +1354,8 @@
 /// Indicates unsupported methods by returning [Error::UnsupportedOperation].
 #[macro_export]
 macro_rules! unsupported {
-	() => {
-		Err(<Error<T>>::UnsupportedOperation.into())
+	($runtime:path) => {
+		Err($crate::Error::<$runtime>::UnsupportedOperation.into())
 	};
 }
 
modifiedruntime/common/dispatch.rsdiffbeforeafterboth
before · runtime/common/dispatch.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 frame_support::{dispatch::DispatchResult, ensure};18use pallet_evm::{PrecompileHandle, PrecompileResult};19use sp_core::H160;20use sp_runtime::DispatchError;21use sp_std::{borrow::ToOwned, vec::Vec};22use pallet_common::{23	CollectionById, CollectionHandle, CommonCollectionOperations, erc::CommonEvmHandler,24	eth::map_eth_to_id,25};26pub use pallet_common::dispatch::CollectionDispatch;27use pallet_fungible::{Pallet as PalletFungible, FungibleHandle};28use pallet_nonfungible::{Pallet as PalletNonfungible, NonfungibleHandle};29use pallet_refungible::{30	Pallet as PalletRefungible, RefungibleHandle, erc_token::RefungibleTokenHandle,31};32use up_data_structs::{33	CollectionMode, CreateCollectionData, MAX_DECIMAL_POINTS, mapping::TokenAddressMapping,34	CollectionId,35};3637pub enum CollectionDispatchT<T>38where39	T: pallet_fungible::Config + pallet_nonfungible::Config + pallet_refungible::Config,40{41	Fungible(FungibleHandle<T>),42	Nonfungible(NonfungibleHandle<T>),43	Refungible(RefungibleHandle<T>),44}45impl<T> CollectionDispatch<T> for CollectionDispatchT<T>46where47	T: pallet_common::Config48		+ pallet_unique::Config49		+ pallet_fungible::Config50		+ pallet_nonfungible::Config51		+ pallet_refungible::Config,52{53	fn create(54		sender: T::CrossAccountId,55		data: CreateCollectionData<T::AccountId>,56	) -> Result<CollectionId, DispatchError> {57		let id = match data.mode {58			CollectionMode::NFT => <PalletNonfungible<T>>::init_collection(sender, data, false)?,59			CollectionMode::Fungible(decimal_points) => {60				// check params61				ensure!(62					decimal_points <= MAX_DECIMAL_POINTS,63					pallet_unique::Error::<T>::CollectionDecimalPointLimitExceeded64				);65				<PalletFungible<T>>::init_collection(sender, data)?66			}67			#[cfg(feature = "refungible")]68			CollectionMode::ReFungible => <PalletRefungible<T>>::init_collection(sender, data)?,6970			#[cfg(not(feature = "refungible"))]71			CollectionMode::ReFungible => {72				return Err(DispatchError::Other("Refunginle pallet is not supported"))73			}74		};75		Ok(id)76	}7778	fn destroy(sender: T::CrossAccountId, collection: CollectionHandle<T>) -> DispatchResult {79		match collection.mode {80			CollectionMode::ReFungible => {81				PalletRefungible::destroy_collection(RefungibleHandle::cast(collection), &sender)?82			}83			CollectionMode::Fungible(_) => {84				PalletFungible::destroy_collection(FungibleHandle::cast(collection), &sender)?85			}86			CollectionMode::NFT => {87				PalletNonfungible::destroy_collection(NonfungibleHandle::cast(collection), &sender)?88			}89		}90		Ok(())91	}9293	fn dispatch(handle: CollectionHandle<T>) -> Self {94		match handle.mode {95			CollectionMode::Fungible(_) => Self::Fungible(FungibleHandle::cast(handle)),96			CollectionMode::NFT => Self::Nonfungible(NonfungibleHandle::cast(handle)),97			CollectionMode::ReFungible => Self::Refungible(RefungibleHandle::cast(handle)),98		}99	}100101	fn into_inner(self) -> CollectionHandle<T> {102		match self {103			Self::Fungible(f) => f.into_inner(),104			Self::Nonfungible(f) => f.into_inner(),105			Self::Refungible(f) => f.into_inner(),106		}107	}108109	fn as_dyn(&self) -> &dyn CommonCollectionOperations<T> {110		match self {111			Self::Fungible(h) => h,112			Self::Nonfungible(h) => h,113			Self::Refungible(h) => h,114		}115	}116}117118impl<T> pallet_evm::OnMethodCall<T> for CollectionDispatchT<T>119where120	T: pallet_common::Config121		+ pallet_unique::Config122		+ pallet_fungible::Config123		+ pallet_nonfungible::Config124		+ pallet_refungible::Config,125	T::AccountId: From<[u8; 32]>,126{127	fn is_reserved(target: &H160) -> bool {128		map_eth_to_id(target).is_some()129	}130	fn is_used(target: &H160) -> bool {131		map_eth_to_id(target)132			.map(<CollectionById<T>>::contains_key)133			.unwrap_or(false)134	}135	fn get_code(target: &H160) -> Option<Vec<u8>> {136		if let Some(collection_id) = map_eth_to_id(target) {137			let collection = <CollectionById<T>>::get(collection_id)?;138			Some(139				match collection.mode {140					CollectionMode::NFT => <NonfungibleHandle<T>>::CODE,141					CollectionMode::Fungible(_) => <FungibleHandle<T>>::CODE,142					CollectionMode::ReFungible => <RefungibleHandle<T>>::CODE,143				}144				.to_owned(),145			)146		} else if let Some((collection_id, _token_id)) =147			<T as pallet_common::Config>::EvmTokenAddressMapping::address_to_token(target)148		{149			let collection = <CollectionById<T>>::get(collection_id)?;150			if collection.mode != CollectionMode::ReFungible {151				return None;152			}153			// TODO: check token existence154			Some(<RefungibleTokenHandle<T>>::CODE.to_owned())155		} else {156			None157		}158	}159	fn call(handle: &mut impl PrecompileHandle) -> Option<PrecompileResult> {160		if let Some(collection_id) = map_eth_to_id(&handle.code_address()) {161			let collection =162				<CollectionHandle<T>>::new_with_gas_limit(collection_id, handle.remaining_gas())?;163			let dispatched = Self::dispatch(collection);164165			match dispatched {166				Self::Fungible(h) => h.call(handle),167				Self::Nonfungible(h) => h.call(handle),168				Self::Refungible(h) => h.call(handle),169			}170		} else if let Some((collection_id, token_id)) =171			<T as pallet_common::Config>::EvmTokenAddressMapping::address_to_token(172				&handle.code_address(),173			) {174			let collection =175				<CollectionHandle<T>>::new_with_gas_limit(collection_id, handle.remaining_gas())?;176			if collection.mode != CollectionMode::ReFungible {177				return None;178			}179180			let h = RefungibleHandle::cast(collection);181			// TODO: check token existence182			RefungibleTokenHandle(h, token_id).call(handle)183		} else {184			None185		}186	}187}
after · runtime/common/dispatch.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 frame_support::{dispatch::DispatchResult, ensure};18use pallet_evm::{PrecompileHandle, PrecompileResult};19use sp_core::H160;20use sp_runtime::DispatchError;21use sp_std::{borrow::ToOwned, vec::Vec};22use pallet_common::{23	CollectionById, CollectionHandle, CommonCollectionOperations, erc::CommonEvmHandler,24	eth::map_eth_to_id,25};26pub use pallet_common::dispatch::CollectionDispatch;27use pallet_fungible::{Pallet as PalletFungible, FungibleHandle};28use pallet_nonfungible::{Pallet as PalletNonfungible, NonfungibleHandle};29use pallet_refungible::{30	Pallet as PalletRefungible, RefungibleHandle, erc_token::RefungibleTokenHandle,31};32use up_data_structs::{33	CollectionMode, CreateCollectionData, MAX_DECIMAL_POINTS, mapping::TokenAddressMapping,34	CollectionId,35};3637#[cfg(not(feature = "refungible"))]38use pallet_common::unsupported;3940pub enum CollectionDispatchT<T>41where42	T: pallet_fungible::Config + pallet_nonfungible::Config + pallet_refungible::Config,43{44	Fungible(FungibleHandle<T>),45	Nonfungible(NonfungibleHandle<T>),46	Refungible(RefungibleHandle<T>),47}48impl<T> CollectionDispatch<T> for CollectionDispatchT<T>49where50	T: pallet_common::Config51		+ pallet_unique::Config52		+ pallet_fungible::Config53		+ pallet_nonfungible::Config54		+ pallet_refungible::Config,55{56	fn create(57		sender: T::CrossAccountId,58		data: CreateCollectionData<T::AccountId>,59	) -> Result<CollectionId, DispatchError> {60		let id = match data.mode {61			CollectionMode::NFT => <PalletNonfungible<T>>::init_collection(sender, data, false)?,62			CollectionMode::Fungible(decimal_points) => {63				// check params64				ensure!(65					decimal_points <= MAX_DECIMAL_POINTS,66					pallet_unique::Error::<T>::CollectionDecimalPointLimitExceeded67				);68				<PalletFungible<T>>::init_collection(sender, data)?69			}7071			#[cfg(feature = "refungible")]72			CollectionMode::ReFungible => <PalletRefungible<T>>::init_collection(sender, data)?,7374			#[cfg(not(feature = "refungible"))]75			CollectionMode::ReFungible => return unsupported!(T)76		};77		Ok(id)78	}7980	fn destroy(sender: T::CrossAccountId, collection: CollectionHandle<T>) -> DispatchResult {81		match collection.mode {82			CollectionMode::ReFungible => {83				PalletRefungible::destroy_collection(RefungibleHandle::cast(collection), &sender)?84			}85			CollectionMode::Fungible(_) => {86				PalletFungible::destroy_collection(FungibleHandle::cast(collection), &sender)?87			}88			CollectionMode::NFT => {89				PalletNonfungible::destroy_collection(NonfungibleHandle::cast(collection), &sender)?90			}91		}92		Ok(())93	}9495	fn dispatch(handle: CollectionHandle<T>) -> Self {96		match handle.mode {97			CollectionMode::Fungible(_) => Self::Fungible(FungibleHandle::cast(handle)),98			CollectionMode::NFT => Self::Nonfungible(NonfungibleHandle::cast(handle)),99			CollectionMode::ReFungible => Self::Refungible(RefungibleHandle::cast(handle)),100		}101	}102103	fn into_inner(self) -> CollectionHandle<T> {104		match self {105			Self::Fungible(f) => f.into_inner(),106			Self::Nonfungible(f) => f.into_inner(),107			Self::Refungible(f) => f.into_inner(),108		}109	}110111	fn as_dyn(&self) -> &dyn CommonCollectionOperations<T> {112		match self {113			Self::Fungible(h) => h,114			Self::Nonfungible(h) => h,115			Self::Refungible(h) => h,116		}117	}118}119120impl<T> pallet_evm::OnMethodCall<T> for CollectionDispatchT<T>121where122	T: pallet_common::Config123		+ pallet_unique::Config124		+ pallet_fungible::Config125		+ pallet_nonfungible::Config126		+ pallet_refungible::Config,127	T::AccountId: From<[u8; 32]>,128{129	fn is_reserved(target: &H160) -> bool {130		map_eth_to_id(target).is_some()131	}132	fn is_used(target: &H160) -> bool {133		map_eth_to_id(target)134			.map(<CollectionById<T>>::contains_key)135			.unwrap_or(false)136	}137	fn get_code(target: &H160) -> Option<Vec<u8>> {138		if let Some(collection_id) = map_eth_to_id(target) {139			let collection = <CollectionById<T>>::get(collection_id)?;140			Some(141				match collection.mode {142					CollectionMode::NFT => <NonfungibleHandle<T>>::CODE,143					CollectionMode::Fungible(_) => <FungibleHandle<T>>::CODE,144					CollectionMode::ReFungible => <RefungibleHandle<T>>::CODE,145				}146				.to_owned(),147			)148		} else if let Some((collection_id, _token_id)) =149			<T as pallet_common::Config>::EvmTokenAddressMapping::address_to_token(target)150		{151			let collection = <CollectionById<T>>::get(collection_id)?;152			if collection.mode != CollectionMode::ReFungible {153				return None;154			}155			// TODO: check token existence156			Some(<RefungibleTokenHandle<T>>::CODE.to_owned())157		} else {158			None159		}160	}161	fn call(handle: &mut impl PrecompileHandle) -> Option<PrecompileResult> {162		if let Some(collection_id) = map_eth_to_id(&handle.code_address()) {163			let collection =164				<CollectionHandle<T>>::new_with_gas_limit(collection_id, handle.remaining_gas())?;165			let dispatched = Self::dispatch(collection);166167			match dispatched {168				Self::Fungible(h) => h.call(handle),169				Self::Nonfungible(h) => h.call(handle),170				Self::Refungible(h) => h.call(handle),171			}172		} else if let Some((collection_id, token_id)) =173			<T as pallet_common::Config>::EvmTokenAddressMapping::address_to_token(174				&handle.code_address(),175			) {176			let collection =177				<CollectionHandle<T>>::new_with_gas_limit(collection_id, handle.remaining_gas())?;178			if collection.mode != CollectionMode::ReFungible {179				return None;180			}181182			let h = RefungibleHandle::cast(collection);183			// TODO: check token existence184			RefungibleTokenHandle(h, token_id).call(handle)185		} else {186			None187		}188	}189}
modifiedruntime/common/mod.rsdiffbeforeafterboth
--- a/runtime/common/mod.rs
+++ b/runtime/common/mod.rs
@@ -43,7 +43,12 @@
 };
 use common_types::{AccountId, BlockNumber};
 
-pub type CommonError = pallet_common::Error<Runtime>;
+#[macro_export]
+macro_rules! unsupported {
+	() => {
+		pallet_common::unsupported!($crate::Runtime)
+	}
+}
 
 /// The address format for describing accounts.
 pub type Address = sp_runtime::MultiAddress<AccountId, ()>;
modifiedruntime/common/runtime_apis.rsdiffbeforeafterboth
--- a/runtime/common/runtime_apis.rs
+++ b/runtime/common/runtime_apis.rs
@@ -205,7 +205,7 @@
                     return pallet_proxy_rmrk_core::rpc::last_collection_idx::<Runtime>();
 
                     #[cfg(not(feature = "rmrk"))]
-                    return Err(CommonError::UnsupportedRuntimeApi.into());
+                    return unsupported!();
                 }
 
                 #[allow(unused_variables)]
@@ -214,7 +214,7 @@
                     return pallet_proxy_rmrk_core::rpc::collection_by_id::<Runtime>(collection_id);
 
                     #[cfg(not(feature = "rmrk"))]
-                    return Err(CommonError::UnsupportedRuntimeApi.into());
+                    return unsupported!();
                 }
 
                 #[allow(unused_variables)]
@@ -223,7 +223,7 @@
                     return pallet_proxy_rmrk_core::rpc::nft_by_id::<Runtime>(collection_id, nft_by_id);
 
                     #[cfg(not(feature = "rmrk"))]
-                    return Err(CommonError::UnsupportedRuntimeApi.into());
+                    return unsupported!();
                 }
 
                 #[allow(unused_variables)]
@@ -232,7 +232,7 @@
                     return pallet_proxy_rmrk_core::rpc::account_tokens::<Runtime>(account_id, collection_id);
 
                     #[cfg(not(feature = "rmrk"))]
-                    return Err(CommonError::UnsupportedRuntimeApi.into());
+                    return unsupported!();
                 }
 
                 #[allow(unused_variables)]
@@ -241,7 +241,7 @@
                     return pallet_proxy_rmrk_core::rpc::nft_children::<Runtime>(collection_id, nft_id);
 
                     #[cfg(not(feature = "rmrk"))]
-                    return Err(CommonError::UnsupportedRuntimeApi.into());
+                    return unsupported!();
                 }
 
                 #[allow(unused_variables)]
@@ -253,7 +253,7 @@
                     return pallet_proxy_rmrk_core::rpc::collection_properties::<Runtime>(collection_id, filter_keys);
 
                     #[cfg(not(feature = "rmrk"))]
-                    return Err(CommonError::UnsupportedRuntimeApi.into());
+                    return unsupported!();
                 }
 
                 #[allow(unused_variables)]
@@ -266,7 +266,7 @@
                     return pallet_proxy_rmrk_core::rpc::nft_properties::<Runtime>(collection_id, nft_id, filter_keys);
 
                     #[cfg(not(feature = "rmrk"))]
-                    return Err(CommonError::UnsupportedRuntimeApi.into());
+                    return unsupported!();
                 }
 
                 #[allow(unused_variables)]
@@ -275,7 +275,7 @@
                     return pallet_proxy_rmrk_core::rpc::nft_resources::<Runtime>(collection_id, nft_id);
 
                     #[cfg(not(feature = "rmrk"))]
-                    return Err(CommonError::UnsupportedRuntimeApi.into());
+                    return unsupported!();
                 }
 
                 #[allow(unused_variables)]
@@ -288,7 +288,7 @@
                     return pallet_proxy_rmrk_core::rpc::nft_resource_priority::<Runtime>(collection_id, nft_id, resource_id);
 
                     #[cfg(not(feature = "rmrk"))]
-                    return Err(CommonError::UnsupportedRuntimeApi.into());
+                    return unsupported!();
                 }
 
                 #[allow(unused_variables)]
@@ -297,7 +297,7 @@
                     return pallet_proxy_rmrk_equip::rpc::base::<Runtime>(base_id);
 
                     #[cfg(not(feature = "rmrk"))]
-                    return Err(CommonError::UnsupportedRuntimeApi.into());
+                    return unsupported!();
                 }
 
                 #[allow(unused_variables)]
@@ -306,7 +306,7 @@
                     return pallet_proxy_rmrk_equip::rpc::base_parts::<Runtime>(base_id);
 
                     #[cfg(not(feature = "rmrk"))]
-                    return Err(CommonError::UnsupportedRuntimeApi.into());
+                    return unsupported!();
                 }
 
                 #[allow(unused_variables)]
@@ -315,7 +315,7 @@
                     return pallet_proxy_rmrk_equip::rpc::theme_names::<Runtime>(base_id);
 
                     #[cfg(not(feature = "rmrk"))]
-                    return Err(CommonError::UnsupportedRuntimeApi.into());
+                    return unsupported!();
                 }
 
                 #[allow(unused_variables)]
@@ -328,7 +328,7 @@
                     return pallet_proxy_rmrk_equip::rpc::theme::<Runtime>(base_id, theme_name, filter_keys);
 
                     #[cfg(not(feature = "rmrk"))]
-                    return Err(CommonError::UnsupportedRuntimeApi.into());
+                    return unsupported!();
                 }
             }