difftreelog
misk: revert owners storage
in: master
2 files changed
pallets/evm-contract-helpers/src/eth.rsdiffbeforeafterboth48#[solidity_interface(name = "ContractHelpers")]48#[solidity_interface(name = "ContractHelpers")]49impl<T: Config> ContractHelpers<T> {49impl<T: Config> ContractHelpers<T> {50 fn contract_owner(&self, contract_address: address) -> Result<address> {50 fn contract_owner(&self, contract_address: address) -> Result<address> {51 Ok(<Pallet<T>>::contract_owner(contract_address)51 Ok(<Owner<T>>::get(contract_address))52 .map_err(dispatch_to_evm::<T>)?53 .as_eth()54 .clone())55 }52 }565357 fn sponsoring_enabled(&self, contract_address: address) -> Result<bool> {54 fn sponsoring_enabled(&self, contract_address: address) -> Result<bool> {65 contract_address: address,62 contract_address: address,66 enabled: bool,63 enabled: bool,67 ) -> Result<void> {64 ) -> Result<void> {68 <Pallet<T>>::ensure_owner(contract_address, caller)?;65 <Pallet<T>>::ensure_owner(contract_address, caller).map_err(dispatch_to_evm::<T>)?;69 <Pallet<T>>::toggle_sponsoring(contract_address, enabled);66 <Pallet<T>>::toggle_sponsoring(contract_address, enabled);70 Ok(())67 Ok(())71 }68 }76 contract_address: address,73 contract_address: address,77 mode: uint8,74 mode: uint8,78 ) -> Result<void> {75 ) -> Result<void> {79 <Pallet<T>>::ensure_owner(contract_address, caller)?;76 <Pallet<T>>::ensure_owner(contract_address, caller).map_err(dispatch_to_evm::<T>)?;80 let mode = SponsoringModeT::from_eth(mode).ok_or("unknown mode")?;77 let mode = SponsoringModeT::from_eth(mode).ok_or("unknown mode")?;81 <Pallet<T>>::set_sponsoring_mode(contract_address, mode);78 <Pallet<T>>::set_sponsoring_mode(contract_address, mode);82 Ok(())79 Ok(())92 contract_address: address,89 contract_address: address,93 rate_limit: uint32,90 rate_limit: uint32,94 ) -> Result<void> {91 ) -> Result<void> {95 <Pallet<T>>::ensure_owner(contract_address, caller)?;92 <Pallet<T>>::ensure_owner(contract_address, caller).map_err(dispatch_to_evm::<T>)?;96 <Pallet<T>>::set_sponsoring_rate_limit(contract_address, rate_limit.into());93 <Pallet<T>>::set_sponsoring_rate_limit(contract_address, rate_limit.into());97 Ok(())94 Ok(())98 }95 }105102106 fn allowed(&self, contract_address: address, user: address) -> Result<bool> {103 fn allowed(&self, contract_address: address, user: address) -> Result<bool> {107 self.0.consume_sload()?;104 self.0.consume_sload()?;108 Ok(<Pallet<T>>::allowed(contract_address, T::CrossAccountId::from_eth(user)))105 Ok(<Pallet<T>>::allowed(contract_address, user))109 }106 }110107111 fn allowlist_enabled(&self, contract_address: address) -> Result<bool> {108 fn allowlist_enabled(&self, contract_address: address) -> Result<bool> {118 contract_address: address,115 contract_address: address,119 enabled: bool,116 enabled: bool,120 ) -> Result<void> {117 ) -> Result<void> {121 <Pallet<T>>::ensure_owner(contract_address, caller)?;118 <Pallet<T>>::ensure_owner(contract_address, caller).map_err(dispatch_to_evm::<T>)?;122 <Pallet<T>>::toggle_allowlist(contract_address, enabled);119 <Pallet<T>>::toggle_allowlist(contract_address, enabled);123 Ok(())120 Ok(())124 }121 }130 user: address,127 user: address,131 allowed: bool,128 allowed: bool,132 ) -> Result<void> {129 ) -> Result<void> {133 <Pallet<T>>::ensure_owner(contract_address, caller)?;130 <Pallet<T>>::ensure_owner(contract_address, caller).map_err(dispatch_to_evm::<T>)?;134 <Pallet<T>>::toggle_allowed(contract_address, user, allowed);131 <Pallet<T>>::toggle_allowed(contract_address, user, allowed);135 Ok(())132 Ok(())136 }133 }149 fn call(handle: &mut impl PrecompileHandle) -> Option<PrecompileResult> {146 fn call(handle: &mut impl PrecompileHandle) -> Option<PrecompileResult> {150 // TODO: Extract to another OnMethodCall handler147 // TODO: Extract to another OnMethodCall handler151 if <AllowlistEnabled<T>>::get(handle.code_address())148 if <AllowlistEnabled<T>>::get(handle.code_address())152 && !<Pallet<T>>::allowed(handle.code_address(), T::CrossAccountId::from_eth(handle.context().caller))149 && !<Pallet<T>>::allowed(handle.code_address(), handle.context().caller)153 {150 {154 return Some(Err(PrecompileFailure::Revert {151 return Some(Err(PrecompileFailure::Revert {155 exit_status: ExitRevert::Reverted,152 exit_status: ExitRevert::Reverted,178pub struct HelpersOnCreate<T: Config>(PhantomData<*const T>);175pub struct HelpersOnCreate<T: Config>(PhantomData<*const T>);179impl<T: Config> OnCreate<T> for HelpersOnCreate<T> {176impl<T: Config> OnCreate<T> for HelpersOnCreate<T> {180 fn on_create(owner: H160, contract: H160) {177 fn on_create(owner: H160, contract: H160) {181 <Owner<T>>::insert(contract, T::CrossAccountId::from_eth(owner));178 <Owner<T>>::insert(contract, owner);182 }179 }183}180}184181187 for HelpersContractSponsoring<T>184 for HelpersContractSponsoring<T>188{185{189 fn get_sponsor(who: &T::CrossAccountId, call: &(H160, Vec<u8>)) -> Option<T::CrossAccountId> {186 fn get_sponsor(who: &T::CrossAccountId, call: &(H160, Vec<u8>)) -> Option<T::CrossAccountId> {187 let (contract, _) = call;190 let mode = <Pallet<T>>::sponsoring_mode(call.0);188 let mode = <Pallet<T>>::sponsoring_mode(*contract);191 if mode == SponsoringModeT::Disabled {189 if mode == SponsoringModeT::Disabled {192 return None;190 return None;193 }191 }194192195 if mode == SponsoringModeT::Allowlisted && !<Pallet<T>>::allowed(call.0, who.clone()) {193 if mode == SponsoringModeT::Allowlisted && !<Pallet<T>>::allowed(*contract, *who.as_eth()) {196 return None;194 return None;197 }195 }198 let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;196 let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;199197200 if let Some(last_tx_block) = <SponsorBasket<T>>::get(&call.0, who.as_eth()) {198 if let Some(last_tx_block) = <SponsorBasket<T>>::get(contract, who.as_eth()) {201 let limit = <SponsoringRateLimit<T>>::get(&call.0);199 let limit = <SponsoringRateLimit<T>>::get(contract);202200203 let timeout = last_tx_block + limit;201 let timeout = last_tx_block + limit;204 if block_number < timeout {202 if block_number < timeout {205 return None;203 return None;206 }204 }207 }205 }208206209 <SponsorBasket<T>>::insert(&call.0, who.as_eth(), block_number);207 <SponsorBasket<T>>::insert(contract, who.as_eth(), block_number);210208211 let sponsor = T::CrossAccountId::from_eth(call.0);209 let sponsor = T::CrossAccountId::from_eth(*contract);212 Some(sponsor)210 Some(sponsor)213 }211 }214}212}pallets/evm-contract-helpers/src/lib.rsdiffbeforeafterboth61 /// * **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 >;696570 #[pallet::storage]66 #[pallet::storage]97 >;93 >;989499 #[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>;120115121 #[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 }139132140 0133 0173 <SponsoringRateLimit<T>>::insert(contract, rate_limit);166 <SponsoringRateLimit<T>>::insert(contract, rate_limit);174 }167 }175168176 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) == user178 || Pallet::<T>::contract_owner(contract).is_ok_and(|owner| *owner == user)179 }171 }180172181 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 }188180189 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 }194186195 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}