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

difftreelog

refactor Chage Owner storage value type H160 -> CrossAccountId BREAKING CHANGE: changed `fn allowed` signature

Trubnikov Sergey2022-08-02parent: #8b00d85.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
@@ -15,8 +15,13 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 use core::marker::PhantomData;
-use evm_coder::{abi::AbiWriter, execution::Result, generate_stubgen, solidity_interface, types::*};
-use pallet_evm_coder_substrate::{SubstrateRecorder, WithRecorder};
+use evm_coder::{
+	abi::AbiWriter,
+	execution::{Result, Error},
+	generate_stubgen, solidity_interface,
+	types::*,
+};
+use pallet_evm_coder_substrate::{SubstrateRecorder, WithRecorder, dispatch_to_evm};
 use pallet_evm::{
 	ExitRevert, OnCreate, OnMethodCall, PrecompileResult, PrecompileFailure, PrecompileHandle,
 	account::CrossAccountId,
@@ -43,7 +48,10 @@
 #[solidity_interface(name = "ContractHelpers")]
 impl<T: Config> ContractHelpers<T> {
 	fn contract_owner(&self, contract_address: address) -> Result<address> {
-		Ok(<Owner<T>>::get(contract_address))
+		Ok(<Pallet<T>>::contract_owner(contract_address)
+			.map_err(dispatch_to_evm::<T>)?
+			.as_eth()
+			.clone())
 	}
 
 	fn sponsoring_enabled(&self, contract_address: address) -> Result<bool> {
@@ -97,7 +105,7 @@
 
 	fn allowed(&self, contract_address: address, user: address) -> Result<bool> {
 		self.0.consume_sload()?;
-		Ok(<Pallet<T>>::allowed(contract_address, user))
+		Ok(<Pallet<T>>::allowed(contract_address, T::CrossAccountId::from_eth(user)))
 	}
 
 	fn allowlist_enabled(&self, contract_address: address) -> Result<bool> {
@@ -141,7 +149,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(), handle.context().caller)
+			&& !<Pallet<T>>::allowed(handle.code_address(), T::CrossAccountId::from_eth(handle.context().caller))
 		{
 			return Some(Err(PrecompileFailure::Revert {
 				exit_status: ExitRevert::Reverted,
@@ -170,7 +178,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, owner);
+		<Owner<T>>::insert(contract, T::CrossAccountId::from_eth(owner));
 	}
 }
 
@@ -184,7 +192,7 @@
 			return None;
 		}
 
-		if mode == SponsoringModeT::Allowlisted && !<Pallet<T>>::allowed(call.0, *who.as_eth()) {
+		if mode == SponsoringModeT::Allowlisted && !<Pallet<T>>::allowed(call.0, who.clone()) {
 			return None;
 		}
 		let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
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)]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:34		frame_system::Config + pallet_evm_coder_substrate::Config + pallet_evm::account::Config35	{36		type ContractAddress: Get<H160>;37		type DefaultSponsoringRateLimit: Get<Self::BlockNumber>;38	}3940	#[pallet::error]41	pub enum Error<T> {42		/// This method is only executable by owner43		NoPermission,44	}4546	#[pallet::pallet]47	#[pallet::generate_store(pub(super) trait Store)]48	pub struct Pallet<T>(_);4950	#[pallet::storage]51	pub(super) type Owner<T: Config> =52		StorageMap<Hasher = Twox128, Key = H160, Value = H160, QueryKind = ValueQuery>;5354	#[pallet::storage]55	#[deprecated]56	pub(super) type SelfSponsoring<T: Config> =57		StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;5859	#[pallet::storage]60	pub(super) type SponsoringMode<T: Config> =61		StorageMap<Hasher = Twox128, Key = H160, Value = SponsoringModeT, QueryKind = OptionQuery>;6263	#[pallet::storage]64	pub(super) type SponsoringRateLimit<T: Config> = StorageMap<65		Hasher = Twox128,66		Key = H160,67		Value = T::BlockNumber,68		QueryKind = ValueQuery,69		OnEmpty = T::DefaultSponsoringRateLimit,70	>;7172	#[pallet::storage]73	pub(super) type SponsorBasket<T: Config> = StorageDoubleMap<74		Hasher1 = Twox128,75		Key1 = H160,76		Hasher2 = Twox128,77		Key2 = H160,78		Value = T::BlockNumber,79		QueryKind = OptionQuery,80	>;8182	#[pallet::storage]83	pub(super) type AllowlistEnabled<T: Config> =84		StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;8586	#[pallet::storage]87	pub(super) type Allowlist<T: Config> = StorageDoubleMap<88		Hasher1 = Twox128,89		Key1 = H160,90		Hasher2 = Twox128,91		Key2 = H160,92		Value = bool,93		QueryKind = ValueQuery,94	>;9596	impl<T: Config> Pallet<T> {97		pub fn sponsoring_mode(contract: H160) -> SponsoringModeT {98			<SponsoringMode<T>>::get(contract)99				.or_else(|| {100					<SelfSponsoring<T>>::get(contract).then(|| SponsoringModeT::Allowlisted)101				})102				.unwrap_or_default()103		}104		pub fn set_sponsoring_mode(contract: H160, mode: SponsoringModeT) {105			if mode == SponsoringModeT::Disabled {106				<SponsoringMode<T>>::remove(contract);107			} else {108				<SponsoringMode<T>>::insert(contract, mode);109			}110			<SelfSponsoring<T>>::remove(contract)111		}112113		pub fn toggle_sponsoring(contract: H160, enabled: bool) {114			Self::set_sponsoring_mode(115				contract,116				if enabled {117					SponsoringModeT::Allowlisted118				} else {119					SponsoringModeT::Disabled120				},121			)122		}123124		pub fn set_sponsoring_rate_limit(contract: H160, rate_limit: T::BlockNumber) {125			<SponsoringRateLimit<T>>::insert(contract, rate_limit);126		}127128		pub fn allowed(contract: H160, user: H160) -> bool {129			<Allowlist<T>>::get(&contract, &user) || <Owner<T>>::get(&contract) == user130		}131132		pub fn toggle_allowlist(contract: H160, enabled: bool) {133			<AllowlistEnabled<T>>::insert(contract, enabled)134		}135136		pub fn toggle_allowed(contract: H160, user: H160, allowed: bool) {137			<Allowlist<T>>::insert(contract, user, allowed);138		}139140		pub fn ensure_owner(contract: H160, user: H160) -> Result<()> {141			ensure!(<Owner<T>>::get(&contract) == user, "no permission");142			Ok(())143		}144	}145}146147#[derive(Encode, Decode, PartialEq, TypeInfo, MaxEncodedLen)]148pub enum SponsoringModeT {149	Disabled,150	Allowlisted,151	Generous,152}153154impl SponsoringModeT {155	fn from_eth(v: u8) -> Option<Self> {156		Some(match v {157			0 => Self::Disabled,158			1 => Self::Allowlisted,159			2 => Self::Generous,160			_ => return None,161		})162	}163	fn to_eth(self) -> u8 {164		match self {165			SponsoringModeT::Disabled => 0,166			SponsoringModeT::Allowlisted => 1,167			SponsoringModeT::Generous => 2,168		}169	}170}171172impl Default for SponsoringModeT {173	fn default() -> Self {174		Self::Disabled175	}176}
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	#[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}