difftreelog
path: Add sponsorship for CrossAccountId.
in: master
2 files changed
pallets/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)
}
}
pallets/evm-contract-helpers/src/lib.rsdiffbeforeafterboth15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.161617#![cfg_attr(not(feature = "std"), no_std)]17#![cfg_attr(not(feature = "std"), no_std)]18#![feature(is_some_with)]191820use codec::{Decode, Encode, MaxEncodedLen};19use codec::{Decode, Encode, MaxEncodedLen};21pub use pallet::*;20pub use pallet::*;27pub mod pallet {26pub mod pallet {28 pub use super::*;27 pub use super::*;29 use frame_support::pallet_prelude::*;28 use frame_support::pallet_prelude::*;29 use pallet_evm_coder_substrate::DispatchResult;30 use sp_core::H160;30 use sp_core::H160;31 use pallet_evm::account::CrossAccountId;31 use pallet_evm::account::CrossAccountId;32 use frame_system::pallet_prelude::BlockNumberFor;32 use frame_system::pallet_prelude::BlockNumberFor;33 use up_data_structs::SponsorshipState;333434 #[pallet::config]35 #[pallet::config]35 pub trait Config:36 pub trait Config:44 /// This method is only executable by owner.45 /// This method is only executable by owner.45 NoPermission,46 NoPermission,464747 /// Contract has no owner.48 /// No pending sponsor for contract.48 NoContractOwner,49 NoPendingSponsor,49 }50 }505151 const STORAGE_VERSION: StorageVersion = StorageVersion::new(1);52 const STORAGE_VERSION: StorageVersion = StorageVersion::new(1);68 pub(super) type SelfSponsoring<T: Config> =69 pub(super) type SelfSponsoring<T: Config> =69 StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;70 StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;7172 #[pallet::storage]73 pub(super) type Sponsoring<T: Config> = StorageMap<74 Hasher = Twox128,75 Key = H160,76 Value = SponsorshipState<T::CrossAccountId>,77 QueryKind = ValueQuery,78 >;707971 /// Store for sponsoring mode.80 /// Store for sponsoring mode.72 /// 81 ///73 /// ### Usage82 /// ### Usage74 /// Prefer to delete collection from storage if mode chaged to [`Disabled`](SponsoringModeT::Disabled).83 /// Prefer to delete collection from storage if mode chaged to [`Disabled`](SponsoringModeT::Disabled).75 /// 84 ///76 /// * **Key** - contract address.85 /// * **Key** - contract address.77 /// * **Value** - [`sponsoring mode`](SponsoringModeT).86 /// * **Value** - [`sponsoring mode`](SponsoringModeT).78 #[pallet::storage]87 #[pallet::storage]79 pub(super) type SponsoringMode<T: Config> =88 pub(super) type SponsoringMode<T: Config> =80 StorageMap<Hasher = Twox128, Key = H160, Value = SponsoringModeT, QueryKind = OptionQuery>;89 StorageMap<Hasher = Twox128, Key = H160, Value = SponsoringModeT, QueryKind = OptionQuery>;819082 /// Storage for sponsoring rate limit in blocks.91 /// Storage for sponsoring rate limit in blocks.83 /// 92 ///84 /// * **Key** - contract address.93 /// * **Key** - contract address.85 /// * **Value** - amount of sponsored blocks.94 /// * **Value** - amount of sponsored blocks.86 #[pallet::storage]95 #[pallet::storage]103 >;112 >;104113105 /// Storege for contracts with [`Allowlisted`](SponsoringModeT::Allowlisted) sponsoring mode.114 /// Storege for contracts with [`Allowlisted`](SponsoringModeT::Allowlisted) sponsoring mode.106 /// 115 ///107 /// ### Usage116 /// ### Usage108 /// Prefer to delete collection from storage if mode chaged to non `Allowlisted`, than set **Value** to **false**.117 /// Prefer to delete collection from storage if mode chaged to non `Allowlisted`, than set **Value** to **false**.109 /// 118 ///110 /// * **Key** - contract address.119 /// * **Key** - contract address.111 /// * **Value** - is contract in [`Allowlisted`](SponsoringModeT::Allowlisted) mode.120 /// * **Value** - is contract in [`Allowlisted`](SponsoringModeT::Allowlisted) mode.112 #[pallet::storage]121 #[pallet::storage]113 pub(super) type AllowlistEnabled<T: Config> =122 pub(super) type AllowlistEnabled<T: Config> =114 StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;123 StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;115124125 /// Storage for users that allowed for sponsorship.126 ///127 /// ### Usage128 /// Prefer to delete record from storage if user no more allowed for sponsorship.129 ///130 /// * **Key1** - contract address.131 /// * **Key2** - user that allowed for sponsorship.132 /// * **Value** - allowance for sponsorship.116 #[pallet::storage]133 #[pallet::storage]117 pub(super) type Allowlist<T: Config> = StorageDoubleMap<134 pub(super) type Allowlist<T: Config> = StorageDoubleMap<118 Hasher1 = Twox128,135 Hasher1 = Twox128,135 }151 }136152137 impl<T: Config> Pallet<T> {153 impl<T: Config> Pallet<T> {154 pub fn set_sponsor(155 sender: &T::CrossAccountId,156 contract: H160,157 sponsor: &T::CrossAccountId,158 ) -> DispatchResult {159 Pallet::<T>::ensure_owner(contract, *sender.as_eth())?;160 Sponsoring::<T>::insert(161 contract,162 SponsorshipState::<T::CrossAccountId>::Unconfirmed(sponsor.clone()),163 );164 Ok(())165 }166167 pub fn confirm_sponsorship(sender: &T::CrossAccountId, contract: H160) -> DispatchResult {168 match Sponsoring::<T>::get(contract) {169 SponsorshipState::Unconfirmed(sponsor) => {170 ensure!(sponsor == *sender, Error::<T>::NoPermission);171 Ok(())172 }173 SponsorshipState::Disabled | SponsorshipState::Confirmed(_) => {174 Err(Error::<T>::NoPendingSponsor.into())175 }176 }177 }178179 pub fn get_sponsor(contract: H160) -> Option<T::CrossAccountId> {180 match Sponsoring::<T>::get(contract) {181 SponsorshipState::Disabled | SponsorshipState::Unconfirmed(_) => None,182 SponsorshipState::Confirmed(sponsor) => Some(sponsor),183 }184 }185138 pub fn sponsoring_mode(contract: H160) -> SponsoringModeT {186 pub fn sponsoring_mode(contract: H160) -> SponsoringModeT {139 <SponsoringMode<T>>::get(contract)187 <SponsoringMode<T>>::get(contract)