git.delta.rocks / unique-network / refs/commits / 3bb7d245f741

difftreelog

refactor remove toggle_sponsoring BREAKING CHANGE

Trubnikov Sergey2022-08-04parent: #e50c725.patch.diff
in: master

2 files changed

modifiedpallets/evm-contract-helpers/src/eth.rsdiffbeforeafterboth
--- a/pallets/evm-contract-helpers/src/eth.rs
+++ b/pallets/evm-contract-helpers/src/eth.rs
@@ -82,18 +82,6 @@
 		Ok(<Pallet<T>>::sponsoring_mode(contract_address) != SponsoringModeT::Disabled)
 	}
 
-	/// Deprecated 
-	fn toggle_sponsoring(
-		&mut self,
-		caller: caller,
-		contract_address: address,
-		enabled: bool,
-	) -> Result<void> {
-		<Pallet<T>>::ensure_owner(contract_address, caller).map_err(dispatch_to_evm::<T>)?;
-		<Pallet<T>>::toggle_sponsoring(contract_address, enabled);
-		Ok(())
-	}
-
 	fn set_sponsoring_mode(
 		&mut self,
 		caller: caller,
modifiedpallets/evm-contract-helpers/src/lib.rsdiffbeforeafterboth
before · pallets/evm-contract-helpers/src/lib.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/>.1617#![cfg_attr(not(feature = "std"), no_std)]1819use codec::{Decode, Encode, MaxEncodedLen};20pub use pallet::*;21pub use eth::*;22use scale_info::TypeInfo;23pub mod eth;2425#[frame_support::pallet]26pub mod pallet {27	pub use super::*;28	use frame_support::pallet_prelude::*;29	use pallet_evm_coder_substrate::DispatchResult;30	use sp_core::H160;31	use pallet_evm::account::CrossAccountId;32	use frame_system::pallet_prelude::BlockNumberFor;33	use up_data_structs::SponsorshipState;3435	#[pallet::config]36	pub trait Config:37		frame_system::Config + pallet_evm_coder_substrate::Config + pallet_evm::account::Config38	{39		type ContractAddress: Get<H160>;40		type DefaultSponsoringRateLimit: Get<Self::BlockNumber>;41	}4243	#[pallet::error]44	pub enum Error<T> {45		/// This method is only executable by owner.46		NoPermission,4748		/// No pending sponsor for contract.49		NoPendingSponsor,50	}5152	const STORAGE_VERSION: StorageVersion = StorageVersion::new(1);5354	#[pallet::pallet]55	#[pallet::storage_version(STORAGE_VERSION)]56	#[pallet::generate_store(pub(super) trait Store)]57	pub struct Pallet<T>(_);5859	/// Store owner for contract.60	///61	/// * **Key** - contract address.62	/// * **Value** - owner for contract.63	#[pallet::storage]64	pub(super) type Owner<T: Config> =65		StorageMap<Hasher = Twox128, Key = H160, Value = H160, QueryKind = ValueQuery>;6667	#[pallet::storage]68	#[deprecated]69	pub(super) type SelfSponsoring<T: Config> =70		StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;7172	#[pallet::storage]73	pub(super) type Sponsoring<T: Config> = StorageMap<74		Hasher = Twox128,75		Key = H160,76		Value = SponsorshipState<T::CrossAccountId>,77		QueryKind = ValueQuery,78	>;7980	/// Store for sponsoring mode.81	///82	/// ### Usage83	/// Prefer to delete collection from storage if mode chaged to [`Disabled`](SponsoringModeT::Disabled).84	///85	/// * **Key** - contract address.86	/// * **Value** - [`sponsoring mode`](SponsoringModeT).87	#[pallet::storage]88	pub(super) type SponsoringMode<T: Config> =89		StorageMap<Hasher = Twox128, Key = H160, Value = SponsoringModeT, QueryKind = OptionQuery>;9091	/// Storage for sponsoring rate limit in blocks.92	///93	/// * **Key** - contract address.94	/// * **Value** - amount of sponsored blocks.95	#[pallet::storage]96	pub(super) type SponsoringRateLimit<T: Config> = StorageMap<97		Hasher = Twox128,98		Key = H160,99		Value = T::BlockNumber,100		QueryKind = ValueQuery,101		OnEmpty = T::DefaultSponsoringRateLimit,102	>;103104	#[pallet::storage]105	pub(super) type SponsorBasket<T: Config> = StorageDoubleMap<106		Hasher1 = Twox128,107		Key1 = H160,108		Hasher2 = Twox128,109		Key2 = H160,110		Value = T::BlockNumber,111		QueryKind = OptionQuery,112	>;113114	/// Storege for contracts with [`Allowlisted`](SponsoringModeT::Allowlisted) sponsoring mode.115	///116	/// ### Usage117	/// Prefer to delete collection from storage if mode chaged to non `Allowlisted`, than set **Value** to **false**.118	///119	/// * **Key** - contract address.120	/// * **Value** - is contract in [`Allowlisted`](SponsoringModeT::Allowlisted) mode.121	#[pallet::storage]122	pub(super) type AllowlistEnabled<T: Config> =123		StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;124125	/// Storage for users that allowed for sponsorship.126	///127	/// ### Usage128	/// Prefer to delete record from storage if user no more allowed for sponsorship.129	///130	/// * **Key1** - contract address.131	/// * **Key2** - user that allowed for sponsorship.132	/// * **Value** - allowance for sponsorship.133	#[pallet::storage]134	pub(super) type Allowlist<T: Config> = StorageDoubleMap<135		Hasher1 = Twox128,136		Key1 = H160,137		Hasher2 = Twox128,138		Key2 = H160,139		Value = bool,140		QueryKind = ValueQuery,141	>;142143	#[pallet::hooks]144	impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {145		fn on_runtime_upgrade() -> Weight {146			let storage_version = StorageVersion::get::<Pallet<T>>();147			if storage_version < StorageVersion::new(1) {}148149			0150		}151	}152153	impl<T: Config> Pallet<T> {154		pub fn set_sponsor(155			sender: &T::CrossAccountId,156			contract: H160,157			sponsor: &T::CrossAccountId,158		) -> DispatchResult {159			Pallet::<T>::ensure_owner(contract, *sender.as_eth())?;160			Sponsoring::<T>::insert(161				contract,162				SponsorshipState::<T::CrossAccountId>::Unconfirmed(sponsor.clone()),163			);164			Ok(())165		}166167		pub fn confirm_sponsorship(sender: &T::CrossAccountId, contract: H160) -> DispatchResult {168			match Sponsoring::<T>::get(contract) {169				SponsorshipState::Unconfirmed(sponsor) => {170					ensure!(sponsor == *sender, Error::<T>::NoPermission);171					Ok(())172				}173				SponsorshipState::Disabled | SponsorshipState::Confirmed(_) => {174					Err(Error::<T>::NoPendingSponsor.into())175				}176			}177		}178179		pub fn get_sponsor(contract: H160) -> Option<T::CrossAccountId> {180			match Sponsoring::<T>::get(contract) {181				SponsorshipState::Disabled | SponsorshipState::Unconfirmed(_) => None,182				SponsorshipState::Confirmed(sponsor) => Some(sponsor),183			}184		}185186		pub fn sponsoring_mode(contract: H160) -> SponsoringModeT {187			<SponsoringMode<T>>::get(contract)188				.or_else(|| {189					<SelfSponsoring<T>>::get(contract).then(|| SponsoringModeT::Allowlisted)190				})191				.unwrap_or_default()192		}193194		pub fn set_sponsoring_mode(contract: H160, mode: SponsoringModeT) {195			if mode == SponsoringModeT::Disabled {196				<SponsoringMode<T>>::remove(contract);197			} else {198				<SponsoringMode<T>>::insert(contract, mode);199			}200			<SelfSponsoring<T>>::remove(contract)201		}202203		pub fn toggle_sponsoring(contract: H160, enabled: bool) {204			Self::set_sponsoring_mode(205				contract,206				if enabled {207					SponsoringModeT::Allowlisted208				} else {209					SponsoringModeT::Disabled210				},211			)212		}213214		pub fn set_sponsoring_rate_limit(contract: H160, rate_limit: T::BlockNumber) {215			<SponsoringRateLimit<T>>::insert(contract, rate_limit);216		}217218		pub fn allowed(contract: H160, user: H160) -> bool {219			<Allowlist<T>>::get(&contract, &user) || <Owner<T>>::get(&contract) == user220		}221222		pub fn toggle_allowlist(contract: H160, enabled: bool) {223			<AllowlistEnabled<T>>::insert(contract, enabled)224		}225226		pub fn toggle_allowed(contract: H160, user: H160, allowed: bool) {227			<Allowlist<T>>::insert(contract, user, allowed);228		}229230		pub fn ensure_owner(contract: H160, user: H160) -> DispatchResult {231			ensure!(<Owner<T>>::get(&contract) == user, Error::<T>::NoPermission);232			Ok(())233		}234	}235236	impl<T: Config> Pallet<T> {237		pub fn contract_owner(contract: H160) -> H160 {238			<Owner<T>>::get(contract)239		}240	}241}242243#[derive(Encode, Decode, PartialEq, TypeInfo, MaxEncodedLen)]244pub enum SponsoringModeT {245	Disabled,246	Allowlisted,247	Generous,248}249250impl SponsoringModeT {251	fn from_eth(v: u8) -> Option<Self> {252		Some(match v {253			0 => Self::Disabled,254			1 => Self::Allowlisted,255			2 => Self::Generous,256			_ => return None,257		})258	}259	fn to_eth(self) -> u8 {260		match self {261			SponsoringModeT::Disabled => 0,262			SponsoringModeT::Allowlisted => 1,263			SponsoringModeT::Generous => 2,264		}265	}266}267268impl Default for SponsoringModeT {269	fn default() -> Self {270		Self::Disabled271	}272}