git.delta.rocks / unique-network / refs/commits / 2dfd73643010

difftreelog

source

pallets/evm-contract-helpers/src/lib.rs4.6 KiBsourcehistory
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 evm_coder::execution::Result;29	use frame_support::pallet_prelude::*;30	use sp_core::H160;3132	#[pallet::config]33	pub trait Config: frame_system::Config + pallet_evm_coder_substrate::Config {34		type ContractAddress: Get<H160>;35		type DefaultSponsoringRateLimit: Get<Self::BlockNumber>;36	}3738	#[pallet::error]39	pub enum Error<T> {40		/// This method is only executable by owner41		NoPermission,42	}4344	#[pallet::pallet]45	#[pallet::generate_store(pub(super) trait Store)]46	pub struct Pallet<T>(_);4748	#[pallet::storage]49	pub(super) type Owner<T: Config> =50		StorageMap<Hasher = Twox128, Key = H160, Value = H160, QueryKind = ValueQuery>;5152	#[pallet::storage]53	#[deprecated]54	pub(super) type SelfSponsoring<T: Config> =55		StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;5657	#[pallet::storage]58	pub(super) type SponsoringMode<T: Config> =59		StorageMap<Hasher = Twox128, Key = H160, Value = SponsoringModeT, QueryKind = OptionQuery>;6061	#[pallet::storage]62	pub(super) type SponsoringRateLimit<T: Config> = StorageMap<63		Hasher = Twox128,64		Key = H160,65		Value = T::BlockNumber,66		QueryKind = ValueQuery,67		OnEmpty = T::DefaultSponsoringRateLimit,68	>;6970	#[pallet::storage]71	pub(super) type SponsorBasket<T: Config> = StorageDoubleMap<72		Hasher1 = Twox128,73		Key1 = H160,74		Hasher2 = Twox128,75		Key2 = H160,76		Value = T::BlockNumber,77		QueryKind = OptionQuery,78	>;7980	#[pallet::storage]81	pub(super) type AllowlistEnabled<T: Config> =82		StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;8384	#[pallet::storage]85	pub(super) type Allowlist<T: Config> = StorageDoubleMap<86		Hasher1 = Twox128,87		Key1 = H160,88		Hasher2 = Twox128,89		Key2 = H160,90		Value = bool,91		QueryKind = ValueQuery,92	>;9394	impl<T: Config> Pallet<T> {95		pub fn sponsoring_mode(contract: H160) -> SponsoringModeT {96			<SponsoringMode<T>>::get(contract)97				.or_else(|| {98					<SelfSponsoring<T>>::get(contract).then(|| SponsoringModeT::Allowlisted)99				})100				.unwrap_or_default()101		}102		pub fn set_sponsoring_mode(contract: H160, mode: SponsoringModeT) {103			if mode == SponsoringModeT::Disabled {104				<SponsoringMode<T>>::remove(contract);105			} else {106				<SponsoringMode<T>>::insert(contract, mode);107			}108			<SelfSponsoring<T>>::remove(contract)109		}110111		pub fn toggle_sponsoring(contract: H160, enabled: bool) {112			Self::set_sponsoring_mode(113				contract,114				if enabled {115					SponsoringModeT::Allowlisted116				} else {117					SponsoringModeT::Disabled118				},119			)120		}121122		pub fn set_sponsoring_rate_limit(contract: H160, rate_limit: T::BlockNumber) {123			<SponsoringRateLimit<T>>::insert(contract, rate_limit);124		}125126		pub fn allowed(contract: H160, user: H160) -> bool {127			<Allowlist<T>>::get(&contract, &user) || <Owner<T>>::get(&contract) == user128		}129130		pub fn toggle_allowlist(contract: H160, enabled: bool) {131			<AllowlistEnabled<T>>::insert(contract, enabled)132		}133134		pub fn toggle_allowed(contract: H160, user: H160, allowed: bool) {135			<Allowlist<T>>::insert(contract, user, allowed);136		}137138		pub fn ensure_owner(contract: H160, user: H160) -> Result<()> {139			ensure!(<Owner<T>>::get(&contract) == user, "no permission");140			Ok(())141		}142	}143}144145#[derive(Encode, Decode, PartialEq, TypeInfo, MaxEncodedLen)]146pub enum SponsoringModeT {147	Disabled,148	Allowlisted,149	Generous,150}151152impl SponsoringModeT {153	fn from_eth(v: u8) -> Option<Self> {154		Some(match v {155			0 => Self::Disabled,156			1 => Self::Allowlisted,157			2 => Self::Generous,158			_ => return None,159		})160	}161	fn to_eth(self) -> u8 {162		match self {163			SponsoringModeT::Disabled => 0,164			SponsoringModeT::Allowlisted => 1,165			SponsoringModeT::Generous => 2,166		}167	}168}169170impl Default for SponsoringModeT {171	fn default() -> Self {172		Self::Disabled173	}174}