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}