git.delta.rocks / unique-network / refs/commits / 6fbb7219f087

difftreelog

misk: revert owners storage

Trubnikov Sergey2022-08-03parent: #d144cc6.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
@@ -48,10 +48,7 @@
 #[solidity_interface(name = "ContractHelpers")]
 impl<T: Config> ContractHelpers<T> {
 	fn contract_owner(&self, contract_address: address) -> Result<address> {
-		Ok(<Pallet<T>>::contract_owner(contract_address)
-			.map_err(dispatch_to_evm::<T>)?
-			.as_eth()
-			.clone())
+		Ok(<Owner<T>>::get(contract_address))
 	}
 
 	fn sponsoring_enabled(&self, contract_address: address) -> Result<bool> {
@@ -65,7 +62,7 @@
 		contract_address: address,
 		enabled: bool,
 	) -> Result<void> {
-		<Pallet<T>>::ensure_owner(contract_address, caller)?;
+		<Pallet<T>>::ensure_owner(contract_address, caller).map_err(dispatch_to_evm::<T>)?;
 		<Pallet<T>>::toggle_sponsoring(contract_address, enabled);
 		Ok(())
 	}
@@ -76,7 +73,7 @@
 		contract_address: address,
 		mode: uint8,
 	) -> Result<void> {
-		<Pallet<T>>::ensure_owner(contract_address, caller)?;
+		<Pallet<T>>::ensure_owner(contract_address, caller).map_err(dispatch_to_evm::<T>)?;
 		let mode = SponsoringModeT::from_eth(mode).ok_or("unknown mode")?;
 		<Pallet<T>>::set_sponsoring_mode(contract_address, mode);
 		Ok(())
@@ -92,7 +89,7 @@
 		contract_address: address,
 		rate_limit: uint32,
 	) -> Result<void> {
-		<Pallet<T>>::ensure_owner(contract_address, caller)?;
+		<Pallet<T>>::ensure_owner(contract_address, caller).map_err(dispatch_to_evm::<T>)?;
 		<Pallet<T>>::set_sponsoring_rate_limit(contract_address, rate_limit.into());
 		Ok(())
 	}
@@ -105,7 +102,7 @@
 
 	fn allowed(&self, contract_address: address, user: address) -> Result<bool> {
 		self.0.consume_sload()?;
-		Ok(<Pallet<T>>::allowed(contract_address, T::CrossAccountId::from_eth(user)))
+		Ok(<Pallet<T>>::allowed(contract_address, user))
 	}
 
 	fn allowlist_enabled(&self, contract_address: address) -> Result<bool> {
@@ -118,7 +115,7 @@
 		contract_address: address,
 		enabled: bool,
 	) -> Result<void> {
-		<Pallet<T>>::ensure_owner(contract_address, caller)?;
+		<Pallet<T>>::ensure_owner(contract_address, caller).map_err(dispatch_to_evm::<T>)?;
 		<Pallet<T>>::toggle_allowlist(contract_address, enabled);
 		Ok(())
 	}
@@ -130,7 +127,7 @@
 		user: address,
 		allowed: bool,
 	) -> Result<void> {
-		<Pallet<T>>::ensure_owner(contract_address, caller)?;
+		<Pallet<T>>::ensure_owner(contract_address, caller).map_err(dispatch_to_evm::<T>)?;
 		<Pallet<T>>::toggle_allowed(contract_address, user, allowed);
 		Ok(())
 	}
@@ -149,7 +146,7 @@
 	fn call(handle: &mut impl PrecompileHandle) -> Option<PrecompileResult> {
 		// TODO: Extract to another OnMethodCall handler
 		if <AllowlistEnabled<T>>::get(handle.code_address())
-			&& !<Pallet<T>>::allowed(handle.code_address(), T::CrossAccountId::from_eth(handle.context().caller))
+			&& !<Pallet<T>>::allowed(handle.code_address(), handle.context().caller)
 		{
 			return Some(Err(PrecompileFailure::Revert {
 				exit_status: ExitRevert::Reverted,
@@ -178,7 +175,7 @@
 pub struct HelpersOnCreate<T: Config>(PhantomData<*const T>);
 impl<T: Config> OnCreate<T> for HelpersOnCreate<T> {
 	fn on_create(owner: H160, contract: H160) {
-		<Owner<T>>::insert(contract, T::CrossAccountId::from_eth(owner));
+		<Owner<T>>::insert(contract, owner);
 	}
 }
 
@@ -187,18 +184,19 @@
 	for HelpersContractSponsoring<T>
 {
 	fn get_sponsor(who: &T::CrossAccountId, call: &(H160, Vec<u8>)) -> Option<T::CrossAccountId> {
-		let mode = <Pallet<T>>::sponsoring_mode(call.0);
+		let (contract, _) = call;
+		let mode = <Pallet<T>>::sponsoring_mode(*contract);
 		if mode == SponsoringModeT::Disabled {
 			return None;
 		}
 
-		if mode == SponsoringModeT::Allowlisted && !<Pallet<T>>::allowed(call.0, who.clone()) {
+		if mode == SponsoringModeT::Allowlisted && !<Pallet<T>>::allowed(*contract, *who.as_eth()) {
 			return None;
 		}
 		let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
 
-		if let Some(last_tx_block) = <SponsorBasket<T>>::get(&call.0, who.as_eth()) {
-			let limit = <SponsoringRateLimit<T>>::get(&call.0);
+		if let Some(last_tx_block) = <SponsorBasket<T>>::get(contract, who.as_eth()) {
+			let limit = <SponsoringRateLimit<T>>::get(contract);
 
 			let timeout = last_tx_block + limit;
 			if block_number < timeout {
@@ -206,9 +204,9 @@
 			}
 		}
 
-		<SponsorBasket<T>>::insert(&call.0, who.as_eth(), block_number);
+		<SponsorBasket<T>>::insert(contract, who.as_eth(), block_number);
 
-		let sponsor = T::CrossAccountId::from_eth(call.0);
+		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> = 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}
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> =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}