diff --git a/bridges/bin/millau/runtime/src/lib.rs b/bridges/bin/millau/runtime/src/lib.rs index e98e6f306a..46921edd58 100644 --- a/bridges/bin/millau/runtime/src/lib.rs +++ b/bridges/bin/millau/runtime/src/lib.rs @@ -37,7 +37,7 @@ use crate::rialto_messages::{ToRialtoMessagePayload, WithRialtoMessageBridge}; use bridge_runtime_common::messages::{source::estimate_message_dispatch_and_delivery_fee, MessageBridge}; use codec::Decode; use pallet_grandpa::{fg_primitives, AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList}; -use pallet_transaction_payment::{FeeDetails, RuntimeDispatchInfo}; +use pallet_transaction_payment::{FeeDetails, Multiplier, RuntimeDispatchInfo}; use sp_api::impl_runtime_apis; use sp_consensus_aura::sr25519::AuthorityId as AuraId; use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; @@ -45,7 +45,7 @@ use sp_runtime::traits::{Block as BlockT, IdentityLookup, NumberFor, OpaqueKeys} use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, MultiSignature, MultiSigner, + ApplyExtrinsicResult, FixedPointNumber, MultiSignature, MultiSigner, Perquintill, }; use sp_std::prelude::*; #[cfg(feature = "std")] @@ -273,13 +273,23 @@ impl pallet_balances::Config for Runtime { parameter_types! { pub const TransactionBaseFee: Balance = 0; pub const TransactionByteFee: Balance = 1; + // values for following parameters are copypasted from polkadot repo, but it is fine + // not to sync them - we're not going to make Rialto a full copy of one of Polkadot-like chains + pub const TargetBlockFullness: Perquintill = Perquintill::from_percent(25); + pub AdjustmentVariable: Multiplier = Multiplier::saturating_from_rational(3, 100_000); + pub MinimumMultiplier: Multiplier = Multiplier::saturating_from_rational(1, 1_000_000u128); } impl pallet_transaction_payment::Config for Runtime { type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; type TransactionByteFee = TransactionByteFee; type WeightToFee = IdentityFee; - type FeeMultiplierUpdate = (); + type FeeMultiplierUpdate = pallet_transaction_payment::TargetedFeeAdjustment< + Runtime, + TargetBlockFullness, + AdjustmentVariable, + MinimumMultiplier, + >; } impl pallet_sudo::Config for Runtime { diff --git a/bridges/bin/millau/runtime/src/rialto_messages.rs b/bridges/bin/millau/runtime/src/rialto_messages.rs index 12af2c3285..2ebf17686f 100644 --- a/bridges/bin/millau/runtime/src/rialto_messages.rs +++ b/bridges/bin/millau/runtime/src/rialto_messages.rs @@ -31,15 +31,19 @@ use frame_support::{ weights::{DispatchClass, Weight}, RuntimeDebug, }; -use sp_runtime::{traits::Zero, FixedPointNumber, FixedU128}; +use sp_runtime::{traits::Saturating, FixedPointNumber, FixedU128}; use sp_std::{convert::TryFrom, ops::RangeInclusive}; /// Initial value of `RialtoToMillauConversionRate` parameter. pub const INITIAL_RIALTO_TO_MILLAU_CONVERSION_RATE: FixedU128 = FixedU128::from_inner(FixedU128::DIV); +/// Initial value of `RialtoFeeMultiplier` parameter. +pub const INITIAL_RIALTO_FEE_MULTIPLIER: FixedU128 = FixedU128::from_inner(FixedU128::DIV); parameter_types! { /// Rialto to Millau conversion rate. Initially we treat both tokens as equal. pub storage RialtoToMillauConversionRate: FixedU128 = INITIAL_RIALTO_TO_MILLAU_CONVERSION_RATE; + /// Fee multiplier value at Rialto chain. + pub storage RialtoFeeMultiplier: FixedU128 = INITIAL_RIALTO_FEE_MULTIPLIER; } /// Message payload for Millau -> Rialto messages. @@ -128,11 +132,15 @@ impl messages::ThisChainWithMessages for Millau { } fn transaction_payment(transaction: MessageTransaction) -> bp_millau::Balance { + // `transaction` may represent transaction from the future, when multiplier value will + // be larger, so let's use slightly increased value + let multiplier = FixedU128::saturating_from_rational(110, 100) + .saturating_mul(pallet_transaction_payment::Pallet::::next_fee_multiplier()); // in our testnets, both per-byte fee and weight-to-fee are 1:1 messages::transaction_payment( bp_millau::BlockWeights::get().get(DispatchClass::Normal).base_extrinsic, 1, - FixedU128::zero(), + multiplier, |weight| weight as _, transaction, ) @@ -195,11 +203,14 @@ impl messages::BridgedChainWithMessages for Rialto { } fn transaction_payment(transaction: MessageTransaction) -> bp_rialto::Balance { + // we don't have a direct access to the value of multiplier at Rialto chain + // => it is a messages module parameter + let multiplier = RialtoFeeMultiplier::get(); // in our testnets, both per-byte fee and weight-to-fee are 1:1 messages::transaction_payment( bp_rialto::BlockWeights::get().get(DispatchClass::Normal).base_extrinsic, 1, - FixedU128::zero(), + multiplier, |weight| weight as _, transaction, ) diff --git a/bridges/bin/rialto/runtime/src/lib.rs b/bridges/bin/rialto/runtime/src/lib.rs index b4a5d806c4..bb20312d1d 100644 --- a/bridges/bin/rialto/runtime/src/lib.rs +++ b/bridges/bin/rialto/runtime/src/lib.rs @@ -43,7 +43,7 @@ use crate::millau_messages::{ToMillauMessagePayload, WithMillauMessageBridge}; use bridge_runtime_common::messages::{source::estimate_message_dispatch_and_delivery_fee, MessageBridge}; use codec::Decode; use pallet_grandpa::{fg_primitives, AuthorityId as GrandpaId, AuthorityList as GrandpaAuthorityList}; -use pallet_transaction_payment::{FeeDetails, RuntimeDispatchInfo}; +use pallet_transaction_payment::{FeeDetails, Multiplier, RuntimeDispatchInfo}; use sp_api::impl_runtime_apis; use sp_consensus_aura::sr25519::AuthorityId as AuraId; use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; @@ -51,7 +51,7 @@ use sp_runtime::traits::{Block as BlockT, IdentityLookup, NumberFor, OpaqueKeys} use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, MultiSignature, MultiSigner, + ApplyExtrinsicResult, FixedPointNumber, MultiSignature, MultiSigner, Perquintill, }; use sp_std::prelude::*; #[cfg(feature = "std")] @@ -380,13 +380,23 @@ impl pallet_balances::Config for Runtime { parameter_types! { pub const TransactionBaseFee: Balance = 0; pub const TransactionByteFee: Balance = 1; + // values for following parameters are copypasted from polkadot repo, but it is fine + // not to sync them - we're not going to make Rialto a full copy of one of Polkadot-like chains + pub const TargetBlockFullness: Perquintill = Perquintill::from_percent(25); + pub AdjustmentVariable: Multiplier = Multiplier::saturating_from_rational(3, 100_000); + pub MinimumMultiplier: Multiplier = Multiplier::saturating_from_rational(1, 1_000_000u128); } impl pallet_transaction_payment::Config for Runtime { type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; type TransactionByteFee = TransactionByteFee; type WeightToFee = IdentityFee; - type FeeMultiplierUpdate = (); + type FeeMultiplierUpdate = pallet_transaction_payment::TargetedFeeAdjustment< + Runtime, + TargetBlockFullness, + AdjustmentVariable, + MinimumMultiplier, + >; } impl pallet_sudo::Config for Runtime { diff --git a/bridges/bin/rialto/runtime/src/millau_messages.rs b/bridges/bin/rialto/runtime/src/millau_messages.rs index bf97478a0a..15e1d52f25 100644 --- a/bridges/bin/rialto/runtime/src/millau_messages.rs +++ b/bridges/bin/rialto/runtime/src/millau_messages.rs @@ -31,15 +31,19 @@ use frame_support::{ weights::{DispatchClass, Weight}, RuntimeDebug, }; -use sp_runtime::{traits::Zero, FixedPointNumber, FixedU128}; +use sp_runtime::{traits::Saturating, FixedPointNumber, FixedU128}; use sp_std::{convert::TryFrom, ops::RangeInclusive}; /// Initial value of `MillauToRialtoConversionRate` parameter. pub const INITIAL_MILLAU_TO_RIALTO_CONVERSION_RATE: FixedU128 = FixedU128::from_inner(FixedU128::DIV); +/// Initial value of `MillauFeeMultiplier` parameter. +pub const INITIAL_MILLAU_FEE_MULTIPLIER: FixedU128 = FixedU128::from_inner(FixedU128::DIV); parameter_types! { /// Millau to Rialto conversion rate. Initially we treat both tokens as equal. pub storage MillauToRialtoConversionRate: FixedU128 = INITIAL_MILLAU_TO_RIALTO_CONVERSION_RATE; + /// Fee multiplier value at Millau chain. + pub storage MillauFeeMultiplier: FixedU128 = INITIAL_MILLAU_FEE_MULTIPLIER; } /// Message payload for Rialto -> Millau messages. @@ -128,11 +132,15 @@ impl messages::ThisChainWithMessages for Rialto { } fn transaction_payment(transaction: MessageTransaction) -> bp_rialto::Balance { + // `transaction` may represent transaction from the future, when multiplier value will + // be larger, so let's use slightly increased value + let multiplier = FixedU128::saturating_from_rational(110, 100) + .saturating_mul(pallet_transaction_payment::Pallet::::next_fee_multiplier()); // in our testnets, both per-byte fee and weight-to-fee are 1:1 messages::transaction_payment( bp_rialto::BlockWeights::get().get(DispatchClass::Normal).base_extrinsic, 1, - FixedU128::zero(), + multiplier, |weight| weight as _, transaction, ) @@ -195,11 +203,14 @@ impl messages::BridgedChainWithMessages for Millau { } fn transaction_payment(transaction: MessageTransaction) -> bp_millau::Balance { + // we don't have a direct access to the value of multiplier at Millau chain + // => it is a messages module parameter + let multiplier = MillauFeeMultiplier::get(); // in our testnets, both per-byte fee and weight-to-fee are 1:1 messages::transaction_payment( bp_millau::BlockWeights::get().get(DispatchClass::Normal).base_extrinsic, 1, - FixedU128::zero(), + multiplier, |weight| weight as _, transaction, ) diff --git a/bridges/bin/runtime-common/src/messages.rs b/bridges/bin/runtime-common/src/messages.rs index 72249e4f4e..08ef582993 100644 --- a/bridges/bin/runtime-common/src/messages.rs +++ b/bridges/bin/runtime-common/src/messages.rs @@ -38,7 +38,7 @@ use frame_support::{ }; use hash_db::Hasher; use sp_runtime::{ - traits::{AtLeast32BitUnsigned, CheckedAdd, CheckedDiv, CheckedMul}, + traits::{AtLeast32BitUnsigned, CheckedAdd, CheckedDiv, CheckedMul, Saturating, Zero}, FixedPointNumber, FixedPointOperand, FixedU128, }; use sp_std::{cmp::PartialOrd, convert::TryFrom, fmt::Debug, marker::PhantomData, ops::RangeInclusive, vec::Vec}; @@ -491,6 +491,7 @@ pub mod target { MessageDispatch>, BalanceOf>> for FromBridgedChainMessageDispatch where + BalanceOf>: Saturating + FixedPointOperand, ThisDispatchInstance: frame_support::traits::Instance, ThisRuntime: pallet_bridge_dispatch::Config + pallet_transaction_payment::Config, @@ -525,13 +526,20 @@ pub mod target { message_id, message.data.payload.map_err(drop), |dispatch_origin, dispatch_weight| { - ThisCurrency::transfer( - dispatch_origin, - relayer_account, - ThisRuntime::WeightToFee::calc(&dispatch_weight), - ExistenceRequirement::AllowDeath, - ) - .map_err(drop) + let unadjusted_weight_fee = ThisRuntime::WeightToFee::calc(&dispatch_weight); + let fee_multiplier = pallet_transaction_payment::Pallet::::next_fee_multiplier(); + let adjusted_weight_fee = fee_multiplier.saturating_mul_int(unadjusted_weight_fee); + if !adjusted_weight_fee.is_zero() { + ThisCurrency::transfer( + dispatch_origin, + relayer_account, + adjusted_weight_fee, + ExistenceRequirement::AllowDeath, + ) + .map_err(drop) + } else { + Ok(()) + } }, ) }