difftreelog
chore store limits in BTreeMap
in: master
3 files changed
pallets/evm-contract-helpers/src/eth.rsdiffbeforeafterboth26};26};27use pallet_evm_coder_substrate::{SubstrateRecorder, WithRecorder, dispatch_to_evm};27use pallet_evm_coder_substrate::{SubstrateRecorder, WithRecorder, dispatch_to_evm};28use pallet_evm_transaction_payment::CallContext;28use pallet_evm_transaction_payment::CallContext;29use sp_core::H160;29use sp_core::{H160, U256};30use up_data_structs::SponsorshipState;30use up_data_structs::SponsorshipState;31use crate::{31use crate::{32 AllowlistEnabled, Config, Owner, Pallet, SponsorBasket, SponsoringFeeLimit,32 AllowlistEnabled, Config, Owner, Pallet, SponsorBasket, SponsoringFeeLimit,259 ) -> Result<void> {259 ) -> Result<void> {260 <Pallet<T>>::ensure_owner(contract_address, caller).map_err(dispatch_to_evm::<T>)?;260 <Pallet<T>>::ensure_owner(contract_address, caller).map_err(dispatch_to_evm::<T>)?;261 <Pallet<T>>::set_sponsoring_fee_limit(contract_address, fee_limit.into());261 <Pallet<T>>::set_sponsoring_fee_limit(contract_address, fee_limit.into())262 .map_err(dispatch_to_evm::<T>)?;262 Ok(())263 Ok(())263 }264 }264265265 fn get_sponsoring_fee_limit(&self, contract_address: address) -> Result<uint256> {266 fn get_sponsoring_fee_limit(&self, contract_address: address) -> Result<uint256> {266 Ok(<SponsoringFeeLimit<T>>::get(contract_address, 0xffffffff))267 Ok(get_sponsoring_fee_limit::<T>(contract_address))267 }268 }268269269 /// Is specified user present in contract allow list270 /// Is specified user present in contract allow list413 }414 }414 }415 }415416416 let sponsored_fee_limit = <SponsoringFeeLimit<T>>::get(contract_address, 0xffffffff);417 let sponsored_fee_limit = get_sponsoring_fee_limit::<T>(contract_address);417418418 if call_context.max_fee > sponsored_fee_limit {419 if call_context.max_fee > sponsored_fee_limit {419 return None;420 return None;425 }426 }426}427}428429fn get_sponsoring_fee_limit<T: Config>(contract_address: address) -> uint256 {430 <SponsoringFeeLimit<T>>::get(contract_address)431 .get(&0xffffffff)432 .cloned()433 .unwrap_or(U256::MAX)434}427435428generate_stubgen!(contract_helpers_impl, ContractHelpersCall<()>, true);436generate_stubgen!(contract_helpers_impl, ContractHelpersCall<()>, true);429generate_stubgen!(contract_helpers_iface, ContractHelpersCall<()>, false);437generate_stubgen!(contract_helpers_iface, ContractHelpersCall<()>, false);pallets/evm-contract-helpers/src/lib.rsdiffbeforeafterboth--- a/pallets/evm-contract-helpers/src/lib.rs
+++ b/pallets/evm-contract-helpers/src/lib.rs
@@ -22,8 +22,12 @@
pub use pallet::*;
pub use eth::*;
use scale_info::TypeInfo;
+use frame_support::storage::bounded_btree_map::BoundedBTreeMap;
pub mod eth;
+/// Maximum number of methods per contract that could have fee limit
+pub const MAX_FEE_LIMITED_METHODS: u32 = 5;
+
#[frame_support::pallet]
pub mod pallet {
pub use super::*;
@@ -48,9 +52,6 @@
/// In case of enabled sponsoring, but no sponsoring rate limit set,
/// this value will be used implicitly
type DefaultSponsoringRateLimit: Get<Self::BlockNumber>;
- /// In case of enabled sponsoring, but no sponsoring fee limit set,
- /// this value will be used implicitly
- type DefaultSponsoringFeeLimit: Get<U256>;
}
#[pallet::error]
@@ -60,6 +61,9 @@
/// No pending sponsor for contract.
NoPendingSponsor,
+
+ /// Number of methods that sponsored limit is defined for exceeds maximum.
+ TooManyMethodsHaveSponsoredLimit,
}
#[pallet::pallet]
@@ -121,14 +125,11 @@
/// * **Key2** - sponsored user address.
/// * **Value** - last sponsored block number.
#[pallet::storage]
- pub(super) type SponsoringFeeLimit<T: Config> = StorageDoubleMap<
- Hasher1 = Twox128,
- Key1 = H160,
- Hasher2 = Blake2_128Concat,
- Key2 = u32,
- Value = U256,
+ pub(super) type SponsoringFeeLimit<T: Config> = StorageMap<
+ Hasher = Twox128,
+ Key = H160,
+ Value = BoundedBTreeMap<u32, U256, ConstU32<MAX_FEE_LIMITED_METHODS>>,
QueryKind = ValueQuery,
- OnEmpty = T::DefaultSponsoringFeeLimit,
>;
#[pallet::storage]
@@ -368,8 +369,13 @@
}
/// Set maximum for gas limit of transaction
- pub fn set_sponsoring_fee_limit(contract: H160, fee_limit: U256) {
- <SponsoringFeeLimit<T>>::insert(contract, 0xffffffff, fee_limit);
+ pub fn set_sponsoring_fee_limit(contract: H160, fee_limit: U256) -> DispatchResult {
+ <SponsoringFeeLimit<T>>::try_mutate(contract, |limits_map| {
+ limits_map
+ .try_insert(0xffffffff, fee_limit)
+ .map_err(|_| <Error<T>>::TooManyMethodsHaveSponsoredLimit)
+ })?;
+ Ok(())
}
/// Is user added to allowlist, or he is owner of specified contract
runtime/common/config/ethereum.rsdiffbeforeafterboth--- a/runtime/common/config/ethereum.rs
+++ b/runtime/common/config/ethereum.rs
@@ -7,10 +7,8 @@
use sp_runtime::{RuntimeAppPublic, Perbill};
use crate::{
runtime_common::{
- dispatch::CollectionDispatchT,
- ethereum::sponsoring::EvmSponsorshipHandler,
- config::sponsoring::{DefaultSponsoringFeeLimit, DefaultSponsoringRateLimit},
- DealWithFees,
+ dispatch::CollectionDispatchT, ethereum::sponsoring::EvmSponsorshipHandler,
+ config::sponsoring::DefaultSponsoringRateLimit, DealWithFees,
},
Runtime, Aura, Balances, Event, ChainId,
};
@@ -117,7 +115,6 @@
type Event = Event;
type ContractAddress = HelpersContractAddress;
type DefaultSponsoringRateLimit = DefaultSponsoringRateLimit;
- type DefaultSponsoringFeeLimit = DefaultSponsoringFeeLimit;
}
impl pallet_evm_coder_substrate::Config for Runtime {}