mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-12 10:01:17 +00:00
Fix tx-payment integrity-test (#6633)
* Fix tx-payment integrity-test * Better error message. * Apply suggestions from code review Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> * Fix line width * Apply suggestions from code review Co-authored-by: Alexander Popiak <alexander.popiak@parity.io> * Fix grumble Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> Co-authored-by: Alexander Popiak <alexander.popiak@parity.io>
This commit is contained in:
@@ -1302,6 +1302,7 @@ macro_rules! decl_module {
|
||||
$(#[doc = $doc_attr:tt])*
|
||||
fn integrity_test() { $( $impl:tt )* }
|
||||
) => {
|
||||
#[cfg(feature = "std")]
|
||||
impl<$trait_instance: $trait_name$(<I>, $instance: $instantiable)?>
|
||||
$crate::traits::IntegrityTest
|
||||
for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )*
|
||||
@@ -1317,6 +1318,7 @@ macro_rules! decl_module {
|
||||
$module:ident<$trait_instance:ident: $trait_name:ident$(<I>, $instance:ident: $instantiable:path)?>;
|
||||
{ $( $other_where_bounds:tt )* }
|
||||
) => {
|
||||
#[cfg(feature = "std")]
|
||||
impl<$trait_instance: $trait_name$(<I>, $instance: $instantiable)?>
|
||||
$crate::traits::IntegrityTest
|
||||
for $module<$trait_instance$(, $instance)?> where $( $other_where_bounds )*
|
||||
|
||||
@@ -20,10 +20,10 @@ frame-support = { version = "2.0.0-rc4", default-features = false, path = "../su
|
||||
frame-system = { version = "2.0.0-rc4", default-features = false, path = "../system" }
|
||||
pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-rc4", default-features = false, path = "./rpc/runtime-api" }
|
||||
smallvec = "1.4.1"
|
||||
sp-io = { version = "2.0.0-rc4", path = "../../primitives/io", default-features = false }
|
||||
sp-core = { version = "2.0.0-rc4", path = "../../primitives/core", default-features = false }
|
||||
|
||||
[dev-dependencies]
|
||||
sp-io = { version = "2.0.0-rc4", path = "../../primitives/io" }
|
||||
sp-core = { version = "2.0.0-rc4", path = "../../primitives/core" }
|
||||
pallet-balances = { version = "2.0.0-rc4", path = "../balances" }
|
||||
sp-storage = { version = "2.0.0-rc4", path = "../../primitives/storage" }
|
||||
|
||||
@@ -36,5 +36,7 @@ std = [
|
||||
"sp-runtime/std",
|
||||
"frame-support/std",
|
||||
"frame-system/std",
|
||||
"pallet-transaction-payment-rpc-runtime-api/std"
|
||||
"pallet-transaction-payment-rpc-runtime-api/std",
|
||||
"sp-io/std",
|
||||
"sp-core/std",
|
||||
]
|
||||
|
||||
@@ -111,6 +111,42 @@ type NegativeImbalanceOf<T> =
|
||||
/// https://w3f-research.readthedocs.io/en/latest/polkadot/Token%20Economics.html
|
||||
pub struct TargetedFeeAdjustment<T, S, V, M>(sp_std::marker::PhantomData<(T, S, V, M)>);
|
||||
|
||||
/// Something that can convert the current multiplier to the next one.
|
||||
pub trait MultiplierUpdate: Convert<Multiplier, Multiplier> {
|
||||
/// Minimum multiplier
|
||||
fn min() -> Multiplier;
|
||||
/// Target block saturation level
|
||||
fn target() -> Perquintill;
|
||||
/// Variability factor
|
||||
fn variability() -> Multiplier;
|
||||
}
|
||||
|
||||
impl MultiplierUpdate for () {
|
||||
fn min() -> Multiplier {
|
||||
Default::default()
|
||||
}
|
||||
fn target() -> Perquintill {
|
||||
Default::default()
|
||||
}
|
||||
fn variability() -> Multiplier {
|
||||
Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
impl<T, S, V, M> MultiplierUpdate for TargetedFeeAdjustment<T, S, V, M>
|
||||
where T: frame_system::Trait, S: Get<Perquintill>, V: Get<Multiplier>, M: Get<Multiplier>,
|
||||
{
|
||||
fn min() -> Multiplier {
|
||||
M::get()
|
||||
}
|
||||
fn target() -> Perquintill {
|
||||
S::get()
|
||||
}
|
||||
fn variability() -> Multiplier {
|
||||
V::get()
|
||||
}
|
||||
}
|
||||
|
||||
impl<T, S, V, M> Convert<Multiplier, Multiplier> for TargetedFeeAdjustment<T, S, V, M>
|
||||
where T: frame_system::Trait, S: Get<Perquintill>, V: Get<Multiplier>, M: Get<Multiplier>,
|
||||
{
|
||||
@@ -192,7 +228,7 @@ pub trait Trait: frame_system::Trait {
|
||||
type WeightToFee: WeightToFeePolynomial<Balance=BalanceOf<Self>>;
|
||||
|
||||
/// Update the multiplier of the next block, based on the previous block's weight.
|
||||
type FeeMultiplierUpdate: Convert<Multiplier, Multiplier>;
|
||||
type FeeMultiplierUpdate: MultiplierUpdate;
|
||||
}
|
||||
|
||||
decl_storage! {
|
||||
@@ -229,6 +265,32 @@ decl_module! {
|
||||
<T as frame_system::Trait>::MaximumBlockWeight::get().try_into().unwrap()
|
||||
).unwrap(),
|
||||
);
|
||||
|
||||
// This is the minimum value of the multiplier. Make sure that if we collapse to this
|
||||
// value, we can recover with a reasonable amount of traffic. For this test we assert
|
||||
// that if we collapse to minimum, the trend will be positive with a weight value
|
||||
// which is 1% more than the target.
|
||||
let min_value = T::FeeMultiplierUpdate::min();
|
||||
let mut target =
|
||||
T::FeeMultiplierUpdate::target() *
|
||||
(T::AvailableBlockRatio::get() * T::MaximumBlockWeight::get());
|
||||
|
||||
// add 1 percent;
|
||||
let addition = target / 100;
|
||||
if addition == 0 {
|
||||
// this is most likely because in a test setup we set everything to ().
|
||||
return;
|
||||
}
|
||||
target += addition;
|
||||
|
||||
sp_io::TestExternalities::new_empty().execute_with(|| {
|
||||
<frame_system::Module<T>>::set_block_limits(target, 0);
|
||||
let next = T::FeeMultiplierUpdate::convert(min_value);
|
||||
assert!(next > min_value, "The minimum bound of the multiplier is too low. When \
|
||||
block saturation is more than target by 1% and multiplier is minimal then \
|
||||
the multiplier doesn't increase."
|
||||
);
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user