mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-31 15:41:02 +00:00
XCM: Properly set the pricing for the DMP router (#6843)
* Properly set the pricing for the DMP router * Publicize price types * Use FixedU128 instead of Percent * Add sp-arithmetic as a dependency for rococo runtime * Add sp-arithmetic as a dependency to all runtimes * Remove duplicate import * Add missing import * Fix tests * Create an appropriate QueueDownwardMessageError variant * Recalculate delivery fee factor based on past queue sizes * Remove unused error variant * Fixes * Fixes * Remove unused imports * Rewrite fee factor update mechanism * Remove unused imports * Fixes * Update runtime/parachains/src/dmp.rs Co-authored-by: Squirrel <gilescope@gmail.com> * Make DeliveryFeeFactor be a StorageMap keyed on ParaIds * Fixes * introduce limit for fee increase on dmp queue * add message_size based fee factor to increment_fee_factor * change message_size fee rate to correct value * fix div by 0 error * bind limit to variable * fix message_size_factor and add DeliveryFeeFactor test * add test for ExponentialPrice implementation * make test formula based * make delivery fee factor test formula based * add max value test for DeliveryFeeFactor and move limit to config * change threshold back to dynamic value and fix tests * fmt * suggested changes and fmt * small stylistic change * fmt * change to tokenlocation * small fixes * fmt * remove sp_arithmetic dependency * Update runtime/parachains/src/dmp.rs Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> --------- Co-authored-by: Squirrel <gilescope@gmail.com> Co-authored-by: Just van Stam <just.van.stam@gmail.com> Co-authored-by: Just van Stam <vstam1@users.noreply.github.com> Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>
This commit is contained in:
@@ -15,7 +15,11 @@
|
||||
// along with Polkadot. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use super::*;
|
||||
use crate::mock::{new_test_ext, Configuration, Dmp, MockGenesisConfig, Paras, System, Test};
|
||||
use crate::{
|
||||
configuration::ActiveConfig,
|
||||
mock::{new_test_ext, Configuration, Dmp, MockGenesisConfig, Paras, System, Test},
|
||||
};
|
||||
use frame_support::assert_ok;
|
||||
use hex_literal::hex;
|
||||
use parity_scale_codec::Encode;
|
||||
use primitives::BlockNumber;
|
||||
@@ -205,3 +209,69 @@ fn verify_dmq_mqc_head_is_externally_accessible() {
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn verify_fee_increment_and_decrement() {
|
||||
let a = ParaId::from(123);
|
||||
let mut genesis = default_genesis_config();
|
||||
genesis.configuration.config.max_downward_message_size = 16777216;
|
||||
new_test_ext(genesis).execute_with(|| {
|
||||
let initial = InitialFactor::get();
|
||||
assert_eq!(DeliveryFeeFactor::<Test>::get(a), initial);
|
||||
|
||||
// Under fee limit
|
||||
queue_downward_message(a, vec![1]).unwrap();
|
||||
assert_eq!(DeliveryFeeFactor::<Test>::get(a), initial);
|
||||
|
||||
// Limit reached so fee is increased
|
||||
queue_downward_message(a, vec![1]).unwrap();
|
||||
let result = InitialFactor::get().saturating_mul(EXPONENTIAL_FEE_BASE);
|
||||
assert_eq!(DeliveryFeeFactor::<Test>::get(a), result);
|
||||
|
||||
Dmp::prune_dmq(a, 1);
|
||||
assert_eq!(DeliveryFeeFactor::<Test>::get(a), initial);
|
||||
|
||||
// 10 Kb message adds additional 0.001 per KB fee factor
|
||||
let big_message = [0; 10240].to_vec();
|
||||
let msg_len_in_kb = big_message.len().saturating_div(1024) as u32;
|
||||
let result = initial.saturating_mul(
|
||||
EXPONENTIAL_FEE_BASE +
|
||||
MESSAGE_SIZE_FEE_BASE.saturating_mul(FixedU128::from_u32(msg_len_in_kb)),
|
||||
);
|
||||
queue_downward_message(a, big_message).unwrap();
|
||||
assert_eq!(DeliveryFeeFactor::<Test>::get(a), result);
|
||||
|
||||
queue_downward_message(a, vec![1]).unwrap();
|
||||
let result = result.saturating_mul(EXPONENTIAL_FEE_BASE);
|
||||
assert_eq!(DeliveryFeeFactor::<Test>::get(a), result);
|
||||
|
||||
Dmp::prune_dmq(a, 3);
|
||||
let result = result / EXPONENTIAL_FEE_BASE;
|
||||
assert_eq!(DeliveryFeeFactor::<Test>::get(a), result);
|
||||
assert_eq!(Dmp::dmq_length(a), 0);
|
||||
|
||||
// Messages under limit will keep decreasing fee factor until base fee factor is reached
|
||||
queue_downward_message(a, vec![1]).unwrap();
|
||||
Dmp::prune_dmq(a, 1);
|
||||
queue_downward_message(a, vec![1]).unwrap();
|
||||
Dmp::prune_dmq(a, 1);
|
||||
assert_eq!(DeliveryFeeFactor::<Test>::get(a), initial);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn verify_fee_factor_reaches_high_value() {
|
||||
let a = ParaId::from(123);
|
||||
let mut genesis = default_genesis_config();
|
||||
genesis.configuration.config.max_downward_message_size = 51200;
|
||||
new_test_ext(genesis).execute_with(|| {
|
||||
let max_messages =
|
||||
Dmp::dmq_max_length(ActiveConfig::<Test>::get().max_downward_message_size);
|
||||
let mut total_fee_factor = FixedU128::from_float(1.0);
|
||||
for _ in 1..max_messages {
|
||||
assert_ok!(queue_downward_message(a, vec![]));
|
||||
total_fee_factor = total_fee_factor + (DeliveryFeeFactor::<Test>::get(a));
|
||||
}
|
||||
assert!(total_fee_factor > FixedU128::from_u32(100_000_000));
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user