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}