1234567891011121314151617#![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: frame_system::Config + pallet_evm_coder_substrate::Config + pallet_evm::account::Config {34 type ContractAddress: Get<H160>;35 type DefaultSponsoringRateLimit: Get<Self::BlockNumber>;36 }3738 #[pallet::error]39 pub enum Error<T> {40 41 NoPermission,42 }4344 #[pallet::pallet]45 #[pallet::generate_store(pub(super) trait Store)]46 pub struct Pallet<T>(_);4748 #[pallet::storage]49 pub(super) type Owner<T: Config> =50 StorageMap<Hasher = Twox128, Key = H160, Value = H160, QueryKind = ValueQuery>;5152 #[pallet::storage]53 #[deprecated]54 pub(super) type SelfSponsoring<T: Config> =55 StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;5657 #[pallet::storage]58 pub(super) type SponsoringMode<T: Config> =59 StorageMap<Hasher = Twox128, Key = H160, Value = SponsoringModeT, QueryKind = OptionQuery>;6061 #[pallet::storage]62 pub(super) type SponsoringRateLimit<T: Config> = StorageMap<63 Hasher = Twox128,64 Key = H160,65 Value = T::BlockNumber,66 QueryKind = ValueQuery,67 OnEmpty = T::DefaultSponsoringRateLimit,68 >;6970 #[pallet::storage]71 pub(super) type SponsorBasket<T: Config> = StorageDoubleMap<72 Hasher1 = Twox128,73 Key1 = H160,74 Hasher2 = Twox128,75 Key2 = H160,76 Value = T::BlockNumber,77 QueryKind = OptionQuery,78 >;7980 #[pallet::storage]81 pub(super) type AllowlistEnabled<T: Config> =82 StorageMap<Hasher = Twox128, Key = H160, Value = bool, QueryKind = ValueQuery>;8384 #[pallet::storage]85 pub(super) type Allowlist<T: Config> = StorageDoubleMap<86 Hasher1 = Twox128,87 Key1 = H160,88 Hasher2 = Twox128,89 Key2 = H160,90 Value = bool,91 QueryKind = ValueQuery,92 >;9394 impl<T: Config> Pallet<T> {95 pub fn sponsoring_mode(contract: H160) -> SponsoringModeT {96 <SponsoringMode<T>>::get(contract)97 .or_else(|| {98 <SelfSponsoring<T>>::get(contract).then(|| SponsoringModeT::Allowlisted)99 })100 .unwrap_or_default()101 }102 pub fn set_sponsoring_mode(contract: H160, mode: SponsoringModeT) {103 if mode == SponsoringModeT::Disabled {104 <SponsoringMode<T>>::remove(contract);105 } else {106 <SponsoringMode<T>>::insert(contract, mode);107 }108 <SelfSponsoring<T>>::remove(contract)109 }110111 pub fn toggle_sponsoring(contract: H160, enabled: bool) {112 Self::set_sponsoring_mode(113 contract,114 if enabled {115 SponsoringModeT::Allowlisted116 } else {117 SponsoringModeT::Disabled118 },119 )120 }121122 pub fn set_sponsoring_rate_limit(contract: H160, rate_limit: T::BlockNumber) {123 <SponsoringRateLimit<T>>::insert(contract, rate_limit);124 }125126 pub fn allowed(contract: H160, user: H160) -> bool {127 <Allowlist<T>>::get(&contract, &user) || <Owner<T>>::get(&contract) == user128 }129130 pub fn toggle_allowlist(contract: H160, enabled: bool) {131 <AllowlistEnabled<T>>::insert(contract, enabled)132 }133134 pub fn toggle_allowed(contract: H160, user: H160, allowed: bool) {135 <Allowlist<T>>::insert(contract, user, allowed);136 }137138 pub fn ensure_owner(contract: H160, user: H160) -> Result<()> {139 ensure!(<Owner<T>>::get(&contract) == user, "no permission");140 Ok(())141 }142 }143}144145#[derive(Encode, Decode, PartialEq, TypeInfo, MaxEncodedLen)]146pub enum SponsoringModeT {147 Disabled,148 Allowlisted,149 Generous,150}151152impl SponsoringModeT {153 fn from_eth(v: u8) -> Option<Self> {154 Some(match v {155 0 => Self::Disabled,156 1 => Self::Allowlisted,157 2 => Self::Generous,158 _ => return None,159 })160 }161 fn to_eth(self) -> u8 {162 match self {163 SponsoringModeT::Disabled => 0,164 SponsoringModeT::Allowlisted => 1,165 SponsoringModeT::Generous => 2,166 }167 }168}169170impl Default for SponsoringModeT {171 fn default() -> Self {172 Self::Disabled173 }174}