git.delta.rocks / unique-network / refs/commits / f96d4840cdf2

difftreelog

path: Add sponsorship for CrossAccountId.

Trubnikov Sergey2022-08-03parent: #6fbb721.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
@@ -51,6 +51,33 @@
 		Ok(<Owner<T>>::get(contract_address))
 	}
 
+	fn set_sponsor(
+		&mut self,
+		caller: caller,
+		contract_address: address,
+		sponsor: address,
+	) -> Result<void> {
+		Pallet::<T>::set_sponsor(
+			&T::CrossAccountId::from_eth(caller),
+			contract_address,
+			&T::CrossAccountId::from_eth(sponsor),
+		)
+		.map_err(dispatch_to_evm::<T>)?;
+		Ok(())
+	}
+
+	fn confirm_sponsorship(&mut self, caller: caller, contract_address: address) -> Result<void> {
+		Pallet::<T>::confirm_sponsorship(&T::CrossAccountId::from_eth(caller), contract_address)
+			.map_err(dispatch_to_evm::<T>)?;
+		Ok(())
+	}
+
+	fn get_sponsor(&self, contract_address: address) -> Result<address> {
+		let sponsor =
+			Pallet::<T>::get_sponsor(contract_address).ok_or("Contract has no sponsor")?;
+		Ok(*sponsor.as_eth())
+	}
+
 	fn sponsoring_enabled(&self, contract_address: address) -> Result<bool> {
 		Ok(<Pallet<T>>::sponsoring_mode(contract_address) != SponsoringModeT::Disabled)
 	}
@@ -190,6 +217,11 @@
 			return None;
 		}
 
+		let sponsor = match <Pallet<T>>::get_sponsor(*contract) {
+			Some(sponsor) => sponsor,
+			None => return None,
+		};
+
 		if mode == SponsoringModeT::Allowlisted && !<Pallet<T>>::allowed(*contract, *who.as_eth()) {
 			return None;
 		}
@@ -206,7 +238,6 @@
 
 		<SponsorBasket<T>>::insert(contract, who.as_eth(), block_number);
 
-		let sponsor = T::CrossAccountId::from_eth(*contract);
 		Some(sponsor)
 	}
 }
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)]18#![feature(is_some_with)]1920use codec::{Decode, Encode, MaxEncodedLen};21pub use pallet::*;22pub use eth::*;23use scale_info::TypeInfo;24pub mod eth;2526#[frame_support::pallet]27pub mod pallet {28	pub use super::*;29	use frame_support::pallet_prelude::*;30	use sp_core::H160;31	use pallet_evm::account::CrossAccountId;32	use frame_system::pallet_prelude::BlockNumberFor;3334	#[pallet::config]35	pub trait Config:36		frame_system::Config + pallet_evm_coder_substrate::Config + pallet_evm::account::Config37	{38		type ContractAddress: Get<H160>;39		type DefaultSponsoringRateLimit: Get<Self::BlockNumber>;40	}4142	#[pallet::error]43	pub enum Error<T> {44		/// This method is only executable by owner.45		NoPermission,4647		/// Contract has no owner.48		NoContractOwner,49	}5051	const STORAGE_VERSION: StorageVersion = StorageVersion::new(1);5253	#[pallet::pallet]54	#[pallet::storage_version(STORAGE_VERSION)]55	#[pallet::generate_store(pub(super) trait Store)]56	pub struct Pallet<T>(_);5758	/// Store owner for contract.59	///60	/// * **Key** - contract address.61	/// * **Value** - owner for contract.62	#[pallet::storage]63	pub(super) type Owner<T: Config> =64		StorageMap<Hasher = Twox128, Key = H160, Value = H160, QueryKind = ValueQuery>;6566	#[pallet::storage]67	#[deprecated]68	pub(super) type SelfSponsoring<T: Config> =69		StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;7071	/// Store for sponsoring mode.72	/// 73	/// ### Usage74	/// Prefer to delete collection from storage if mode chaged to [`Disabled`](SponsoringModeT::Disabled).75	/// 76	/// * **Key** - contract address.77	/// * **Value** - [`sponsoring mode`](SponsoringModeT).78	#[pallet::storage]79	pub(super) type SponsoringMode<T: Config> =80		StorageMap<Hasher = Twox128, Key = H160, Value = SponsoringModeT, QueryKind = OptionQuery>;8182	/// Storage for sponsoring rate limit in blocks.83	/// 84	/// * **Key** - contract address.85	/// * **Value** - amount of sponsored blocks.86	#[pallet::storage]87	pub(super) type SponsoringRateLimit<T: Config> = StorageMap<88		Hasher = Twox128,89		Key = H160,90		Value = T::BlockNumber,91		QueryKind = ValueQuery,92		OnEmpty = T::DefaultSponsoringRateLimit,93	>;9495	#[pallet::storage]96	pub(super) type SponsorBasket<T: Config> = StorageDoubleMap<97		Hasher1 = Twox128,98		Key1 = H160,99		Hasher2 = Twox128,100		Key2 = H160,101		Value = T::BlockNumber,102		QueryKind = OptionQuery,103	>;104105	/// Storege for contracts with [`Allowlisted`](SponsoringModeT::Allowlisted) sponsoring mode.106	/// 107	/// ### Usage108	/// Prefer to delete collection from storage if mode chaged to non `Allowlisted`, than set **Value** to **false**.109	/// 110	/// * **Key** - contract address.111	/// * **Value** - is contract in [`Allowlisted`](SponsoringModeT::Allowlisted) mode.112	#[pallet::storage]113	pub(super) type AllowlistEnabled<T: Config> =114		StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;115116	#[pallet::storage]117	pub(super) type Allowlist<T: Config> = StorageDoubleMap<118		Hasher1 = Twox128,119		Key1 = H160,120		Hasher2 = Twox128,121		Key2 = H160,122		Value = bool,123		QueryKind = ValueQuery,124	>;125126	#[pallet::hooks]127	impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {128		fn on_runtime_upgrade() -> Weight {129			let storage_version = StorageVersion::get::<Pallet<T>>();130			if storage_version < StorageVersion::new(1) {131			}132133			0134		}135	}136137	impl<T: Config> Pallet<T> {138		pub fn sponsoring_mode(contract: H160) -> SponsoringModeT {139			<SponsoringMode<T>>::get(contract)140				.or_else(|| {141					<SelfSponsoring<T>>::get(contract).then(|| SponsoringModeT::Allowlisted)142				})143				.unwrap_or_default()144		}145		pub fn set_sponsoring_mode(contract: H160, mode: SponsoringModeT) {146			if mode == SponsoringModeT::Disabled {147				<SponsoringMode<T>>::remove(contract);148			} else {149				<SponsoringMode<T>>::insert(contract, mode);150			}151			<SelfSponsoring<T>>::remove(contract)152		}153154		pub fn toggle_sponsoring(contract: H160, enabled: bool) {155			Self::set_sponsoring_mode(156				contract,157				if enabled {158					SponsoringModeT::Allowlisted159				} else {160					SponsoringModeT::Disabled161				},162			)163		}164165		pub fn set_sponsoring_rate_limit(contract: H160, rate_limit: T::BlockNumber) {166			<SponsoringRateLimit<T>>::insert(contract, rate_limit);167		}168169		pub fn allowed(contract: H160, user: H160) -> bool {170			<Allowlist<T>>::get(&contract, &user) || <Owner<T>>::get(&contract) == user171		}172173		pub fn toggle_allowlist(contract: H160, enabled: bool) {174			<AllowlistEnabled<T>>::insert(contract, enabled)175		}176177		pub fn toggle_allowed(contract: H160, user: H160, allowed: bool) {178			<Allowlist<T>>::insert(contract, user, allowed);179		}180181		pub fn ensure_owner(contract: H160, user: H160) -> DispatchResult {182			ensure!(<Owner<T>>::get(&contract) == user, Error::<T>::NoPermission);183			Ok(())184		}185	}186187	impl<T: Config> Pallet<T> {188		pub fn contract_owner(contract: H160) -> H160 {189			<Owner<T>>::get(contract)190		}191	}192}193194#[derive(Encode, Decode, PartialEq, TypeInfo, MaxEncodedLen)]195pub enum SponsoringModeT {196	Disabled,197	Allowlisted,198	Generous,199}200201impl SponsoringModeT {202	fn from_eth(v: u8) -> Option<Self> {203		Some(match v {204			0 => Self::Disabled,205			1 => Self::Allowlisted,206			2 => Self::Generous,207			_ => return None,208		})209	}210	fn to_eth(self) -> u8 {211		match self {212			SponsoringModeT::Disabled => 0,213			SponsoringModeT::Allowlisted => 1,214			SponsoringModeT::Generous => 2,215		}216	}217}218219impl Default for SponsoringModeT {220	fn default() -> Self {221		Self::Disabled222	}223}
after · 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}