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:
Keith Yeung
2023-04-20 19:04:33 +08:00
committed by GitHub
parent b3e2153f2f
commit 023d459857
18 changed files with 351 additions and 45 deletions
+71 -1
View File
@@ -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));
});
}