1#![cfg_attr(not(feature = "std"), no_std)]23pub use pallet::*;4pub use eth::*;5pub mod eth;67#[frame_support::pallet]8pub mod pallet {9 use evm_coder::execution::Result;10 use frame_support::pallet_prelude::*;11 use sp_core::H160;1213 #[pallet::config]14 pub trait Config: frame_system::Config + pallet_evm_coder_substrate::Config {15 type ContractAddress: Get<H160>;16 type DefaultSponsoringRateLimit: Get<Self::BlockNumber>;17 }1819 #[pallet::error]20 pub enum Error<T> {21 22 NoPermission,23 }2425 #[pallet::pallet]26 #[pallet::generate_store(pub(super) trait Store)]27 pub struct Pallet<T>(_);2829 #[pallet::storage]30 pub(super) type Owner<T: Config> =31 StorageMap<Hasher = Twox128, Key = H160, Value = H160, QueryKind = ValueQuery>;3233 #[pallet::storage]34 pub(super) type SelfSponsoring<T: Config> =35 StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;3637 #[pallet::storage]38 pub(super) type SponsoringRateLimit<T: Config> = StorageMap<39 Hasher = Twox128,40 Key = H160,41 Value = T::BlockNumber,42 QueryKind = ValueQuery,43 OnEmpty = T::DefaultSponsoringRateLimit,44 >;4546 #[pallet::storage]47 pub(super) type SponsorBasket<T: Config> = StorageDoubleMap<48 Hasher1 = Twox128,49 Key1 = H160,50 Hasher2 = Twox128,51 Key2 = H160,52 Value = T::BlockNumber,53 QueryKind = OptionQuery,54 >;5556 #[pallet::storage]57 pub(super) type AllowlistEnabled<T: Config> =58 StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;5960 #[pallet::storage]61 pub(super) type Allowlist<T: Config> = StorageDoubleMap<62 Hasher1 = Twox128,63 Key1 = H160,64 Hasher2 = Twox128,65 Key2 = H160,66 Value = bool,67 QueryKind = ValueQuery,68 >;6970 impl<T: Config> Pallet<T> {71 pub fn toggle_sponsoring(contract: H160, enabled: bool) {72 <SelfSponsoring<T>>::insert(contract, enabled);73 }7475 pub fn set_sponsoring_rate_limit(contract: H160, rate_limit: T::BlockNumber) {76 <SponsoringRateLimit<T>>::insert(contract, rate_limit);77 }7879 pub fn allowed(contract: H160, user: H160) -> bool {80 <Allowlist<T>>::get(&contract, &user) || <Owner<T>>::get(&contract) == user81 }8283 pub fn toggle_allowlist(contract: H160, enabled: bool) {84 <AllowlistEnabled<T>>::insert(contract, enabled)85 }8687 pub fn toggle_allowed(contract: H160, user: H160, allowed: bool) {88 <Allowlist<T>>::insert(contract, user, allowed);89 }9091 pub fn ensure_owner(contract: H160, user: H160) -> Result<()> {92 ensure!(<Owner<T>>::get(&contract) == user, "no permission");93 Ok(())94 }95 }96}