Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.
Merged
Changes from 1 commit
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
a72fb9a
Return FeeDetails in compute_fee_raw()
liuchengxu Dec 8, 2020
1c807af
Add payment_queryDetails rpc
liuchengxu Dec 8, 2020
7685575
Simplify serde attribute a bit
liuchengxu Dec 8, 2020
5994f88
Merge branch 'master' of https://github.com/paritytech/substrate into…
liuchengxu Dec 8, 2020
7b965bf
Merge branch 'master' of https://github.com/paritytech/substrate into…
liuchengxu Dec 9, 2020
ca58b81
Fix line width check
liuchengxu Dec 9, 2020
f319b32
Use saturating_add()
liuchengxu Dec 9, 2020
71f675d
Merge branch 'master' of https://github.com/paritytech/substrate into…
liuchengxu Dec 16, 2020
df5131b
Move transaction payment rpc types to types.rs
liuchengxu Dec 16, 2020
43ea398
Add file header
liuchengxu Dec 16, 2020
57a3c8c
Fix test
liuchengxu Dec 16, 2020
e2f76b7
Update Cargo.lock
liuchengxu Dec 16, 2020
517d38a
Nit
liuchengxu Dec 16, 2020
9d1b780
Merge branch 'master' of https://github.com/paritytech/substrate into…
liuchengxu Dec 17, 2020
a0693da
Apply the review suggestions
liuchengxu Dec 19, 2020
8c2cae8
.
liuchengxu Dec 19, 2020
00d80a2
.
liuchengxu Dec 19, 2020
a331455
Fix serde
liuchengxu Dec 19, 2020
8aa6313
Fix rust doc
liuchengxu Dec 19, 2020
422e6d1
.
liuchengxu Dec 19, 2020
1632dbf
Merge branch 'master' of https://github.com/paritytech/substrate into…
liuchengxu Dec 29, 2020
3cfc821
Update frame/transaction-payment/src/types.rs
liuchengxu Jan 1, 2021
e4556f9
Merge branch 'master' of https://github.com/paritytech/substrate into…
liuchengxu Jan 1, 2021
7bf0be6
Merge branch 'add-fee-details-rpc' of https://github.com/liuchengxu/s…
liuchengxu Jan 1, 2021
ff6bf96
Use NumberOrHex in fee details RPC
liuchengxu Jan 1, 2021
1676d18
Address review feedback
liuchengxu Jan 1, 2021
0a54c50
Nits
liuchengxu Jan 1, 2021
98869e7
Update some docs
liuchengxu Jan 1, 2021
ae77260
Merge branch 'master' of https://github.com/paritytech/substrate into…
liuchengxu Jan 1, 2021
ea053a3
Address review
liuchengxu Jan 4, 2021
f9365eb
Merge branch 'master' of https://github.com/paritytech/substrate into…
liuchengxu Jan 4, 2021
b02d85d
Update frame/transaction-payment/src/types.rs
liuchengxu Jan 4, 2021
adb7a58
Happy 2021
liuchengxu Jan 4, 2021
e75131e
Merge branch 'master' of https://github.com/paritytech/substrate into…
liuchengxu Jan 7, 2021
14c1319
Nit
liuchengxu Jan 7, 2021
05ea3b7
Merge branch 'master' of https://github.com/paritytech/substrate into…
liuchengxu Jan 8, 2021
d6ed580
Merge branch 'master' of https://github.com/paritytech/substrate into…
liuchengxu Jan 13, 2021
e6e945b
Address code review
liuchengxu Jan 13, 2021
db686bd
Merge branch 'master' of https://github.com/paritytech/substrate into…
liuchengxu Jan 13, 2021
76312b4
Remove needless bound
liuchengxu Jan 14, 2021
faacef8
Merge branch 'master' of https://github.com/paritytech/substrate into…
liuchengxu Jan 14, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Return FeeDetails in compute_fee_raw()
  • Loading branch information
liuchengxu committed Dec 8, 2020
commit a72fb9a248a0a6c707f759cc4e5f3c09a0f352d8
120 changes: 93 additions & 27 deletions frame/transaction-payment/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ use sp_runtime::{
},
traits::{
Saturating, SignedExtension, SaturatedConversion, Convert, Dispatchable,
DispatchInfoOf, PostDispatchInfoOf,
DispatchInfoOf, PostDispatchInfoOf, AtLeast32BitUnsigned
},
};
use pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo;
Expand Down Expand Up @@ -330,32 +330,23 @@ impl<T: Config> Module<T> where
}

/// Compute the final fee value for a particular transaction.
///
/// The final fee is composed of:
/// - `base_fee`: This is the minimum amount a user pays for a transaction. It is declared
/// as a base _weight_ in the runtime and converted to a fee using `WeightToFee`.
/// - `len_fee`: The length fee, the amount paid for the encoded length (in bytes) of the
/// transaction.
/// - `weight_fee`: This amount is computed based on the weight of the transaction. Weight
/// accounts for the execution time of a transaction.
/// - `targeted_fee_adjustment`: This is a multiplier that can tune the final fee based on
/// the congestion of the network.
/// - (Optional) `tip`: If included in the transaction, the tip will be added on top. Only
/// signed transactions can have a tip.
///
/// The base fee and adjusted weight and length fees constitute the _inclusion fee,_ which is
/// the minimum fee for a transaction to be included in a block.
///
/// ```ignore
/// inclusion_fee = base_fee + len_fee + [targeted_fee_adjustment * weight_fee];
/// final_fee = inclusion_fee + tip;
/// ```
pub fn compute_fee(
len: u32,
info: &DispatchInfoOf<T::Call>,
tip: BalanceOf<T>,
) -> BalanceOf<T> where
T::Call: Dispatchable<Info=DispatchInfo>,
{
Self::compute_fee_details(len, info, tip).final_fee()
}

/// Compute the fee details for a particular transaction.
pub fn compute_fee_details(
len: u32,
info: &DispatchInfoOf<T::Call>,
tip: BalanceOf<T>,
) -> FeeDetails<BalanceOf<T>> where
T::Call: Dispatchable<Info=DispatchInfo>,
{
Self::compute_fee_raw(len, info.weight, tip, info.pays_fee)
}
Expand All @@ -371,6 +362,18 @@ impl<T: Config> Module<T> where
tip: BalanceOf<T>,
) -> BalanceOf<T> where
T::Call: Dispatchable<Info=DispatchInfo,PostInfo=PostDispatchInfo>,
{
Self::compute_actual_fee_details(len, info, post_info, tip).final_fee()
}

/// Compute the actual post dispatch fee details for a particular transaction.
pub fn compute_actual_fee_details(
len: u32,
info: &DispatchInfoOf<T::Call>,
post_info: &PostDispatchInfoOf<T::Call>,
tip: BalanceOf<T>,
) -> FeeDetails<BalanceOf<T>> where
T::Call: Dispatchable<Info=DispatchInfo,PostInfo=PostDispatchInfo>,
{
Self::compute_fee_raw(len, post_info.calc_actual_weight(info), tip, post_info.pays_fee(info))
}
Expand All @@ -380,7 +383,7 @@ impl<T: Config> Module<T> where
weight: Weight,
tip: BalanceOf<T>,
pays_fee: Pays,
) -> BalanceOf<T> {
) -> FeeDetails<BalanceOf<T>> {
if pays_fee == Pays::Yes {
let len = <BalanceOf<T>>::from(len);
let per_byte = T::TransactionByteFee::get();
Expand All @@ -395,12 +398,19 @@ impl<T: Config> Module<T> where
let adjusted_weight_fee = multiplier.saturating_mul_int(unadjusted_weight_fee);

let base_fee = Self::weight_to_fee(T::ExtrinsicBaseWeight::get());
base_fee
.saturating_add(fixed_len_fee)
.saturating_add(adjusted_weight_fee)
.saturating_add(tip)
FeeDetails {
inclusion_fee: Some(InclusionFee {
base_fee,
len_fee: fixed_len_fee,
adjusted_weight_fee
}),
tip
}
} else {
tip
FeeDetails {
inclusion_fee: None,
tip
}
}
}

Expand All @@ -426,6 +436,62 @@ impl<T> Convert<Weight, BalanceOf<T>> for Module<T> where
}
}

/// The base fee and adjusted weight and length fees constitute the _inclusion fee,_ which is
/// the minimum fee for a transaction to be included in a block.
#[derive(Encode, Decode, Clone, Eq, PartialEq, RuntimeDebug)]
#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))]
pub struct InclusionFee<Balance> {
/// This is the minimum amount a user pays for a transaction. It is declared
/// as a base _weight_ in the runtime and converted to a fee using `WeightToFee`.
pub base_fee: Balance,
/// The length fee, the amount paid for the encoded length (in bytes) of the transaction.
pub len_fee: Balance,
/// - `targeted_fee_adjustment`: This is a multiplier that can tune the final fee based on
/// the congestion of the network.
/// - `weight_fee`: This amount is computed based on the weight of the transaction. Weight
/// accounts for the execution time of a transaction.
///
/// adjusted_weight_fee = targeted_fee_adjustment * weight_fee
pub adjusted_weight_fee: Balance,
}

impl<Balance: AtLeast32BitUnsigned + Copy> InclusionFee<Balance> {
/// Returns the total of inclusion fee.
///
/// ```ignore
/// inclusion_fee = base_fee + len_fee + adjusted_weight_fee
/// ```
pub fn total(&self) -> Balance {
self.base_fee
.saturating_add(self.len_fee)
.saturating_add(self.adjusted_weight_fee)
}
}

/// The `final_fee` is composed of:
/// - (Optional) `inclusion_fee`: Only the `Pays::Yes` transaction can have the inclusion fee.
/// - (Optional) `tip`: If included in the transaction, the tip will be added on top. Only
/// signed transactions can have a tip.
#[derive(Encode, Decode, Clone, Eq, PartialEq, RuntimeDebug)]
#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))]
pub struct FeeDetails<Balance> {
pub inclusion_fee: Option<InclusionFee<Balance>>,
pub tip: Balance,
}

impl<Balance: AtLeast32BitUnsigned + Default + Copy> FeeDetails<Balance> {
/// Returns the final fee.
///
/// ```ignore
/// final_fee = inclusion_fee + tip;
/// ```
pub fn final_fee(&self) -> Balance {
self.inclusion_fee.as_ref().map(|i|i.total()).unwrap_or_default() + self.tip
}
}

/// Require the transactor pay for themselves and maybe include a tip to gain additional priority
/// in the queue.
#[derive(Encode, Decode, Clone, Eq, PartialEq)]
Expand Down