difftreelog
feat implement sponsoring primitive for contract helpers
in: master
2 files changed
pallets/contract-helpers/Cargo.tomldiffbeforeafterbothno changes
pallets/contract-helpers/src/lib.rsdiffbeforeafterboth227 }227 }228 }228 }229229230 pub struct ContractSponsorshipHandler<T>(PhantomData<T>);231 impl<T, C> SponsorshipHandler<T::AccountId, C> for ContractSponsorshipHandler<T>232 where233 T: Config,234 C: IsSubType<pallet_contracts::Call<T>>,235 T::AccountId: UncheckedFrom<T::Hash>,236 T::AccountId: AsRef<[u8]>,237 {238 fn get_sponsor(who: &T::AccountId, call: &C) -> Option<T::AccountId> {239 match IsSubType::<pallet_contracts::Call<T>>::is_sub_type(call) {240 Some(pallet_contracts::Call::call(dest, _value, _gas_limit, _data)) => {241 let called_contract: T::AccountId =242 T::Lookup::lookup((*dest).clone()).unwrap_or_default();243 if <SelfSponsoring<T>>::get(&called_contract) {244 let last_tx_block = SponsorBasket::<T>::get(&called_contract, &who);245 let block_number =246 <frame_system::Pallet<T>>::block_number() as T::BlockNumber;247 let rate_limit = SponsoringRateLimit::<T>::get(&called_contract);248 let limit_time = last_tx_block + rate_limit;249250 if block_number >= limit_time {251 SponsorBasket::<T>::insert(&called_contract, who, block_number);252 return Some(called_contract);253 }254 }255 }256 _ => {}257 }258 None259 }260 }230}261}231262