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

difftreelog

docs

Trubnikov Sergey2022-08-02parent: #c396bdd.patch.diff
in: master

1 file changed

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> = StorageMap<64		Hasher = Twox128,65		Key = H160,66		Value = T::CrossAccountId,67		QueryKind = OptionQuery,68	>;6970	#[pallet::storage]71	#[deprecated]72	pub(super) type SelfSponsoring<T: Config> =73		StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;7475	#[pallet::storage]76	#[deprecated]77	pub(super) type SponsoringMode<T: Config> =78		StorageMap<Hasher = Twox128, Key = H160, Value = SponsoringModeT, QueryKind = OptionQuery>;7980	#[pallet::storage]81	#[deprecated]82	pub(super) type SponsoringRateLimit<T: Config> = StorageMap<83		Hasher = Twox128,84		Key = H160,85		Value = T::BlockNumber,86		QueryKind = ValueQuery,87		OnEmpty = T::DefaultSponsoringRateLimit,88	>;8990	#[pallet::storage]91	#[deprecated]92	pub(super) type SponsorBasket<T: Config> = StorageDoubleMap<93		Hasher1 = Twox128,94		Key1 = H160,95		Hasher2 = Twox128,96		Key2 = H160,97		Value = T::BlockNumber,98		QueryKind = OptionQuery,99	>;100101	#[pallet::storage]102	#[deprecated]103	pub(super) type AllowlistEnabled<T: Config> =104		StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;105106	#[pallet::storage]107	#[deprecated]108	pub(super) type Allowlist<T: Config> = StorageDoubleMap<109		Hasher1 = Twox128,110		Key1 = H160,111		Hasher2 = Twox128,112		Key2 = H160,113		Value = bool,114		QueryKind = ValueQuery,115	>;116117	#[pallet::hooks]118	impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {119		fn on_runtime_upgrade() -> Weight {120			let storage_version = StorageVersion::get::<Pallet<T>>();121			if storage_version < StorageVersion::new(1) {122				<Owner<T>>::translate_values::<H160, _>(|address| Some(T::CrossAccountId::from_eth(address)));123			}124125			0126		}127	}128129	impl<T: Config> Pallet<T> {130		pub fn sponsoring_mode(contract: H160) -> SponsoringModeT {131			<SponsoringMode<T>>::get(contract)132				.or_else(|| {133					<SelfSponsoring<T>>::get(contract).then(|| SponsoringModeT::Allowlisted)134				})135				.unwrap_or_default()136		}137		pub fn set_sponsoring_mode(contract: H160, mode: SponsoringModeT) {138			if mode == SponsoringModeT::Disabled {139				<SponsoringMode<T>>::remove(contract);140			} else {141				<SponsoringMode<T>>::insert(contract, mode);142			}143			<SelfSponsoring<T>>::remove(contract)144		}145146		pub fn toggle_sponsoring(contract: H160, enabled: bool) {147			Self::set_sponsoring_mode(148				contract,149				if enabled {150					SponsoringModeT::Allowlisted151				} else {152					SponsoringModeT::Disabled153				},154			)155		}156157		pub fn set_sponsoring_rate_limit(contract: H160, rate_limit: T::BlockNumber) {158			<SponsoringRateLimit<T>>::insert(contract, rate_limit);159		}160161		pub fn allowed(contract: H160, user: T::CrossAccountId) -> bool {162			<Allowlist<T>>::get(&contract, user.as_eth())163				|| Pallet::<T>::contract_owner(contract).is_ok_and(|owner| *owner == user)164		}165166		pub fn toggle_allowlist(contract: H160, enabled: bool) {167			<AllowlistEnabled<T>>::insert(contract, enabled)168		}169170		pub fn toggle_allowed(contract: H160, user: H160, allowed: bool) {171			<Allowlist<T>>::insert(contract, user, allowed);172		}173174		pub fn ensure_owner(contract: H160, user: H160) -> evm_coder::execution::Result<()> {175			ensure!(Pallet::<T>::contract_owner(contract).is_ok_and(|owner| *owner.as_eth() == user), "no permission");176			Ok(())177		}178	}179180	impl<T: Config> Pallet<T> {181		pub fn contract_owner(contract: H160) -> Result<T::CrossAccountId, DispatchError> {182			Ok(<Owner<T>>::get(contract).ok_or::<Error<T>>(Error::NoContractOwner)?)183		}184	}185}186187#[derive(Encode, Decode, PartialEq, TypeInfo, MaxEncodedLen)]188pub enum SponsoringModeT {189	Disabled,190	Allowlisted,191	Generous,192}193194impl SponsoringModeT {195	fn from_eth(v: u8) -> Option<Self> {196		Some(match v {197			0 => Self::Disabled,198			1 => Self::Allowlisted,199			2 => Self::Generous,200			_ => return None,201		})202	}203	fn to_eth(self) -> u8 {204		match self {205			SponsoringModeT::Disabled => 0,206			SponsoringModeT::Allowlisted => 1,207			SponsoringModeT::Generous => 2,208		}209	}210}211212impl Default for SponsoringModeT {213	fn default() -> Self {214		Self::Disabled215	}216}
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)]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> = StorageMap<64		Hasher = Twox128,65		Key = H160,66		Value = T::CrossAccountId,67		QueryKind = OptionQuery,68	>;6970	#[pallet::storage]71	#[deprecated]72	pub(super) type SelfSponsoring<T: Config> =73		StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;7475	/// Store for sponsoring mode.76	/// 77	/// ### Usage78	/// Prefer to delete collection from storage if mode chaged to [`Disabled`](SponsoringModeT::Disabled).79	/// 80	/// * **Key** - contract address.81	/// * **Value** - [`sponsoring mode`](SponsoringModeT).82	#[pallet::storage]83	pub(super) type SponsoringMode<T: Config> =84		StorageMap<Hasher = Twox128, Key = H160, Value = SponsoringModeT, QueryKind = OptionQuery>;8586	/// Storage for sponsoring rate limit in blocks.87	/// 88	/// * **Key** - contract address.89	/// * **Value** - amount of sponsored blocks.90	#[pallet::storage]91	pub(super) type SponsoringRateLimit<T: Config> = StorageMap<92		Hasher = Twox128,93		Key = H160,94		Value = T::BlockNumber,95		QueryKind = ValueQuery,96		OnEmpty = T::DefaultSponsoringRateLimit,97	>;9899	#[pallet::storage]100	#[deprecated]101	pub(super) type SponsorBasket<T: Config> = StorageDoubleMap<102		Hasher1 = Twox128,103		Key1 = H160,104		Hasher2 = Twox128,105		Key2 = H160,106		Value = T::BlockNumber,107		QueryKind = OptionQuery,108	>;109110	/// Storege for contracts with [`Allowlisted`](SponsoringModeT::Allowlisted) sponsoring mode.111	/// 112	/// ### Usage113	/// Prefer to delete collection from storage if mode chaged to non `Allowlisted`, than set **Value** to **false**.114	/// 115	/// * **Key** - contract address.116	/// * **Value** - is contract in [`Allowlisted`](SponsoringModeT::Allowlisted) mode.117	#[pallet::storage]118	pub(super) type AllowlistEnabled<T: Config> =119		StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;120121	#[pallet::storage]122	#[deprecated]123	pub(super) type Allowlist<T: Config> = StorageDoubleMap<124		Hasher1 = Twox128,125		Key1 = H160,126		Hasher2 = Twox128,127		Key2 = H160,128		Value = bool,129		QueryKind = ValueQuery,130	>;131132	#[pallet::hooks]133	impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {134		fn on_runtime_upgrade() -> Weight {135			let storage_version = StorageVersion::get::<Pallet<T>>();136			if storage_version < StorageVersion::new(1) {137				<Owner<T>>::translate_values::<H160, _>(|address| Some(T::CrossAccountId::from_eth(address)));138			}139140			0141		}142	}143144	impl<T: Config> Pallet<T> {145		pub fn sponsoring_mode(contract: H160) -> SponsoringModeT {146			<SponsoringMode<T>>::get(contract)147				.or_else(|| {148					<SelfSponsoring<T>>::get(contract).then(|| SponsoringModeT::Allowlisted)149				})150				.unwrap_or_default()151		}152		pub fn set_sponsoring_mode(contract: H160, mode: SponsoringModeT) {153			if mode == SponsoringModeT::Disabled {154				<SponsoringMode<T>>::remove(contract);155			} else {156				<SponsoringMode<T>>::insert(contract, mode);157			}158			<SelfSponsoring<T>>::remove(contract)159		}160161		pub fn toggle_sponsoring(contract: H160, enabled: bool) {162			Self::set_sponsoring_mode(163				contract,164				if enabled {165					SponsoringModeT::Allowlisted166				} else {167					SponsoringModeT::Disabled168				},169			)170		}171172		pub fn set_sponsoring_rate_limit(contract: H160, rate_limit: T::BlockNumber) {173			<SponsoringRateLimit<T>>::insert(contract, rate_limit);174		}175176		pub fn allowed(contract: H160, user: T::CrossAccountId) -> bool {177			<Allowlist<T>>::get(&contract, user.as_eth())178				|| Pallet::<T>::contract_owner(contract).is_ok_and(|owner| *owner == user)179		}180181		pub fn toggle_allowlist(contract: H160, enabled: bool) {182			<AllowlistEnabled<T>>::insert(contract, enabled)183		}184185		pub fn toggle_allowed(contract: H160, user: H160, allowed: bool) {186			<Allowlist<T>>::insert(contract, user, allowed);187		}188189		pub fn ensure_owner(contract: H160, user: H160) -> evm_coder::execution::Result<()> {190			ensure!(Pallet::<T>::contract_owner(contract).is_ok_and(|owner| *owner.as_eth() == user), "no permission");191			Ok(())192		}193	}194195	impl<T: Config> Pallet<T> {196		pub fn contract_owner(contract: H160) -> Result<T::CrossAccountId, DispatchError> {197			Ok(<Owner<T>>::get(contract).ok_or::<Error<T>>(Error::NoContractOwner)?)198		}199	}200}201202#[derive(Encode, Decode, PartialEq, TypeInfo, MaxEncodedLen)]203pub enum SponsoringModeT {204	Disabled,205	Allowlisted,206	Generous,207}208209impl SponsoringModeT {210	fn from_eth(v: u8) -> Option<Self> {211		Some(match v {212			0 => Self::Disabled,213			1 => Self::Allowlisted,214			2 => Self::Generous,215			_ => return None,216		})217	}218	fn to_eth(self) -> u8 {219		match self {220			SponsoringModeT::Disabled => 0,221			SponsoringModeT::Allowlisted => 1,222			SponsoringModeT::Generous => 2,223		}224	}225}226227impl Default for SponsoringModeT {228	fn default() -> Self {229		Self::Disabled230	}231}