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
61 /// * **Value** - owner for contract.61 /// * **Value** - owner for contract.
62 #[pallet::storage]62 #[pallet::storage]
63 pub(super) type Owner<T: Config> = StorageMap<63 pub(super) type Owner<T: Config> =
64 Hasher = Twox128,64 StorageMap<Hasher = Twox128, Key = H160, Value = H160, QueryKind = ValueQuery>;
65 Key = H160,
66 Value = T::CrossAccountId,
67 QueryKind = OptionQuery,
68 >;
6965
70 #[pallet::storage]66 #[pallet::storage]
97 >;93 >;
9894
99 #[pallet::storage]95 #[pallet::storage]
100 #[deprecated]
101 pub(super) type SponsorBasket<T: Config> = StorageDoubleMap<96 pub(super) type SponsorBasket<T: Config> = StorageDoubleMap<
102 Hasher1 = Twox128,97 Hasher1 = Twox128,
103 Key1 = H160,98 Key1 = H160,
119 StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;114 StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;
120115
121 #[pallet::storage]116 #[pallet::storage]
122 #[deprecated]
123 pub(super) type Allowlist<T: Config> = StorageDoubleMap<117 pub(super) type Allowlist<T: Config> = StorageDoubleMap<
124 Hasher1 = Twox128,118 Hasher1 = Twox128,
125 Key1 = H160,119 Key1 = H160,
134 fn on_runtime_upgrade() -> Weight {128 fn on_runtime_upgrade() -> Weight {
135 let storage_version = StorageVersion::get::<Pallet<T>>();129 let storage_version = StorageVersion::get::<Pallet<T>>();
136 if storage_version < StorageVersion::new(1) {130 if storage_version < StorageVersion::new(1) {
137 <Owner<T>>::translate_values::<H160, _>(|address| Some(T::CrossAccountId::from_eth(address)));
138 }131 }
139132
140 0133 0
173 <SponsoringRateLimit<T>>::insert(contract, rate_limit);166 <SponsoringRateLimit<T>>::insert(contract, rate_limit);
174 }167 }
175168
176 pub fn allowed(contract: H160, user: T::CrossAccountId) -> bool {169 pub fn allowed(contract: H160, user: H160) -> bool {
177 <Allowlist<T>>::get(&contract, user.as_eth())170 <Allowlist<T>>::get(&contract, &user) || <Owner<T>>::get(&contract) == user
178 || Pallet::<T>::contract_owner(contract).is_ok_and(|owner| *owner == user)
179 }171 }
180172
181 pub fn toggle_allowlist(contract: H160, enabled: bool) {173 pub fn toggle_allowlist(contract: H160, enabled: bool) {
186 <Allowlist<T>>::insert(contract, user, allowed);178 <Allowlist<T>>::insert(contract, user, allowed);
187 }179 }
188180
189 pub fn ensure_owner(contract: H160, user: H160) -> evm_coder::execution::Result<()> {181 pub fn ensure_owner(contract: H160, user: H160) -> DispatchResult {
190 ensure!(Pallet::<T>::contract_owner(contract).is_ok_and(|owner| *owner.as_eth() == user), "no permission");182 ensure!(<Owner<T>>::get(&contract) == user, Error::<T>::NoPermission);
191 Ok(())183 Ok(())
192 }184 }
193 }185 }
194186
195 impl<T: Config> Pallet<T> {187 impl<T: Config> Pallet<T> {
196 pub fn contract_owner(contract: H160) -> Result<T::CrossAccountId, DispatchError> {188 pub fn contract_owner(contract: H160) -> H160 {
197 Ok(<Owner<T>>::get(contract).ok_or::<Error<T>>(Error::NoContractOwner)?)189 <Owner<T>>::get(contract)
198 }190 }
199 }191 }
200}192}