Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
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
8 changes: 2 additions & 6 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions bin/node-template/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,12 @@ impl_runtime_apis! {
) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo<Balance> {
TransactionPayment::query_info(uxt, len)
}
fn query_fee_details(
uxt: <Block as BlockT>::Extrinsic,
len: u32,
) -> pallet_transaction_payment::FeeDetails<Balance> {
TransactionPayment::query_fee_details(uxt, len)
}
}

#[cfg(feature = "runtime-benchmarks")]
Expand Down
5 changes: 4 additions & 1 deletion bin/node/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ use pallet_grandpa::{AuthorityId as GrandpaId, AuthorityList as GrandpaAuthority
use pallet_grandpa::fg_primitives;
use pallet_im_online::sr25519::AuthorityId as ImOnlineId;
use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId;
use pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo;
use pallet_transaction_payment::{FeeDetails, RuntimeDispatchInfo};
pub use pallet_transaction_payment::{Multiplier, TargetedFeeAdjustment, CurrencyAdapter};
use pallet_session::{historical as pallet_session_historical};
use sp_inherents::{InherentData, CheckInherentsResult};
Expand Down Expand Up @@ -1259,6 +1259,9 @@ impl_runtime_apis! {
fn query_info(uxt: <Block as BlockT>::Extrinsic, len: u32) -> RuntimeDispatchInfo<Balance> {
TransactionPayment::query_info(uxt, len)
}
fn query_fee_details(uxt: <Block as BlockT>::Extrinsic, len: u32) -> FeeDetails<Balance> {
TransactionPayment::query_fee_details(uxt, len)
}
}

impl sp_session::SessionKeys<Block> for Runtime {
Expand Down
3 changes: 1 addition & 2 deletions frame/transaction-payment/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@ sp-std = { version = "2.0.0", default-features = false, path = "../../primitives
sp-runtime = { version = "2.0.0", default-features = false, path = "../../primitives/runtime" }
frame-support = { version = "2.0.0", default-features = false, path = "../support" }
frame-system = { version = "2.0.0", default-features = false, path = "../system" }
pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0", default-features = false, path = "./rpc/runtime-api" }
smallvec = "1.4.1"
sp-io = { version = "2.0.0", path = "../../primitives/io", default-features = false }
sp-core = { version = "2.0.0", path = "../../primitives/core", default-features = false }

[dev-dependencies]
serde_json = "1.0.41"
pallet-balances = { version = "2.0.0", path = "../balances" }
sp-storage = { version = "2.0.0", path = "../../primitives/storage" }

Expand All @@ -37,7 +37,6 @@ std = [
"sp-runtime/std",
"frame-support/std",
"frame-system/std",
"pallet-transaction-payment-rpc-runtime-api/std",
"sp-io/std",
"sp-core/std",
]
1 change: 0 additions & 1 deletion frame/transaction-payment/rpc/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ jsonrpc-core-client = "15.1.0"
jsonrpc-derive = "15.1.0"
sp-core = { version = "2.0.0", path = "../../../primitives/core" }
sp-rpc = { version = "2.0.0", path = "../../../primitives/rpc" }
serde = { version = "1.0.101", features = ["derive"] }
sp-runtime = { version = "2.0.0", path = "../../../primitives/runtime" }
sp-api = { version = "2.0.0", path = "../../../primitives/api" }
sp-blockchain = { version = "2.0.0", path = "../../../primitives/blockchain" }
Expand Down
11 changes: 2 additions & 9 deletions frame/transaction-payment/rpc/runtime-api/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,16 @@ readme = "README.md"
targets = ["x86_64-unknown-linux-gnu"]

[dependencies]
serde = { version = "1.0.101", optional = true, features = ["derive"] }
sp-api = { version = "2.0.0", default-features = false, path = "../../../../primitives/api" }
codec = { package = "parity-scale-codec", version = "1.3.6", default-features = false, features = ["derive"] }
sp-std = { version = "2.0.0", default-features = false, path = "../../../../primitives/std" }
sp-runtime = { version = "2.0.0", default-features = false, path = "../../../../primitives/runtime" }
frame-support = { version = "2.0.0", default-features = false, path = "../../../support" }

[dev-dependencies]
serde_json = "1.0.41"
pallet-transaction-payment = { version = "2.0.0", default-features = false, path = "../../../transaction-payment" }

[features]
default = ["std"]
std = [
"serde",
"sp-api/std",
"codec/std",
"sp-std/std",
"sp-runtime/std",
"frame-support/std",
"pallet-transaction-payment/std",
]
79 changes: 5 additions & 74 deletions frame/transaction-payment/rpc/runtime-api/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,85 +19,16 @@

#![cfg_attr(not(feature = "std"), no_std)]

use sp_std::prelude::*;
use frame_support::weights::{Weight, DispatchClass};
use codec::{Encode, Codec, Decode};
#[cfg(feature = "std")]
use serde::{Serialize, Deserialize, Serializer, Deserializer};
use sp_runtime::traits::{MaybeDisplay, MaybeFromStr};
use codec::Codec;
use sp_runtime::traits::MaybeDisplay;

/// Information related to a dispatchable's class, weight, and fee that can be queried from the runtime.
#[derive(Eq, PartialEq, Encode, Decode, Default)]
#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))]
#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))]
pub struct RuntimeDispatchInfo<Balance> {
/// Weight of this dispatch.
pub weight: Weight,
/// Class of this dispatch.
pub class: DispatchClass,
/// The inclusion fee of this dispatch. This does not include a tip or anything else that
/// depends on the signature (i.e. depends on a `SignedExtension`).
#[cfg_attr(feature = "std", serde(bound(serialize = "Balance: std::fmt::Display")))]
#[cfg_attr(feature = "std", serde(serialize_with = "serialize_as_string"))]
#[cfg_attr(feature = "std", serde(bound(deserialize = "Balance: std::str::FromStr")))]
#[cfg_attr(feature = "std", serde(deserialize_with = "deserialize_from_string"))]
pub partial_fee: Balance,
}

#[cfg(feature = "std")]
fn serialize_as_string<S: Serializer, T: std::fmt::Display>(t: &T, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(&t.to_string())
}

#[cfg(feature = "std")]
fn deserialize_from_string<'de, D: Deserializer<'de>, T: std::str::FromStr>(deserializer: D) -> Result<T, D::Error> {
let s = String::deserialize(deserializer)?;
s.parse::<T>().map_err(|_| serde::de::Error::custom("Parse from string failed"))
}
pub use pallet_transaction_payment::{FeeDetails, InclusionFee, RuntimeDispatchInfo};

sp_api::decl_runtime_apis! {
pub trait TransactionPaymentApi<Balance> where
Balance: Codec + MaybeDisplay + MaybeFromStr,
Balance: Codec + MaybeDisplay,
{
fn query_info(uxt: Block::Extrinsic, len: u32) -> RuntimeDispatchInfo<Balance>;
}
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn should_serialize_and_deserialize_properly_with_string() {
let info = RuntimeDispatchInfo {
weight: 5,
class: DispatchClass::Normal,
partial_fee: 1_000_000_u64,
};

let json_str = r#"{"weight":5,"class":"normal","partialFee":"1000000"}"#;

assert_eq!(serde_json::to_string(&info).unwrap(), json_str);
assert_eq!(serde_json::from_str::<RuntimeDispatchInfo<u64>>(json_str).unwrap(), info);

// should not panic
serde_json::to_value(&info).unwrap();
}

#[test]
fn should_serialize_and_deserialize_properly_large_value() {
let info = RuntimeDispatchInfo {
weight: 5,
class: DispatchClass::Normal,
partial_fee: u128::max_value(),
};

let json_str = r#"{"weight":5,"class":"normal","partialFee":"340282366920938463463374607431768211455"}"#;

assert_eq!(serde_json::to_string(&info).unwrap(), json_str);
assert_eq!(serde_json::from_str::<RuntimeDispatchInfo<u128>>(json_str).unwrap(), info);

// should not panic
serde_json::to_value(&info).unwrap();
fn query_fee_details(uxt: Block::Extrinsic, len: u32) -> FeeDetails<Balance>;
}
}
66 changes: 60 additions & 6 deletions frame/transaction-payment/rpc/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,16 @@
//! RPC interface for the transaction payment module.

use std::sync::Arc;
use std::convert::TryInto;
use codec::{Codec, Decode};
use sp_blockchain::HeaderBackend;
use jsonrpc_core::{Error as RpcError, ErrorCode, Result};
use jsonrpc_derive::rpc;
use sp_runtime::{generic::BlockId, traits::{Block as BlockT, MaybeDisplay, MaybeFromStr}};
use sp_runtime::{generic::BlockId, traits::{Block as BlockT, MaybeDisplay}};
use sp_api::ProvideRuntimeApi;
use sp_core::Bytes;
use pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo;
use sp_rpc::number::NumberOrHex;
use pallet_transaction_payment_rpc_runtime_api::{FeeDetails, InclusionFee, RuntimeDispatchInfo};
pub use pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi as TransactionPaymentRuntimeApi;
pub use self::gen_client::Client as TransactionPaymentClient;

Expand All @@ -37,6 +39,12 @@ pub trait TransactionPaymentApi<BlockHash, ResponseType> {
encoded_xt: Bytes,
at: Option<BlockHash>
) -> Result<ResponseType>;
#[rpc(name = "payment_queryFeeDetails")]
fn query_fee_details(
&self,
encoded_xt: Bytes,
at: Option<BlockHash>
) -> Result<FeeDetails<NumberOrHex>>;
}

/// A struct that implements the [`TransactionPaymentApi`].
Expand All @@ -48,7 +56,7 @@ pub struct TransactionPayment<C, P> {
impl<C, P> TransactionPayment<C, P> {
/// Create new `TransactionPayment` with the given reference to the client.
pub fn new(client: Arc<C>) -> Self {
TransactionPayment { client, _marker: Default::default() }
Self { client, _marker: Default::default() }
}
}

Expand All @@ -69,13 +77,15 @@ impl From<Error> for i64 {
}
}

impl<C, Block, Balance> TransactionPaymentApi<<Block as BlockT>::Hash, RuntimeDispatchInfo<Balance>>
for TransactionPayment<C, Block>
impl<C, Block, Balance> TransactionPaymentApi<
<Block as BlockT>::Hash,
RuntimeDispatchInfo<Balance>,
> for TransactionPayment<C, Block>
where
Block: BlockT,
C: 'static + ProvideRuntimeApi<Block> + HeaderBackend<Block>,
C::Api: TransactionPaymentRuntimeApi<Block, Balance>,
Balance: Codec + MaybeDisplay + MaybeFromStr,
Balance: Codec + MaybeDisplay + Copy + TryInto<NumberOrHex>,
{
fn query_info(
&self,
Expand All @@ -101,4 +111,48 @@ where
data: Some(format!("{:?}", e).into()),
})
}

fn query_fee_details(
&self,
encoded_xt: Bytes,
at: Option<<Block as BlockT>::Hash>,
) -> Result<FeeDetails<NumberOrHex>> {
let api = self.client.runtime_api();
let at = BlockId::hash(at.unwrap_or_else(||
// If the block hash is not supplied assume the best block.
self.client.info().best_hash
));

let encoded_len = encoded_xt.len() as u32;

let uxt: Block::Extrinsic = Decode::decode(&mut &*encoded_xt).map_err(|e| RpcError {
code: ErrorCode::ServerError(Error::DecodeError.into()),
message: "Unable to query fee details.".into(),
data: Some(format!("{:?}", e).into()),
})?;
let fee_details = api.query_fee_details(&at, uxt, encoded_len).map_err(|e| RpcError {
code: ErrorCode::ServerError(Error::RuntimeError.into()),
message: "Unable to query fee details.".into(),
data: Some(format!("{:?}", e).into()),
})?;

let try_into_rpc_balance = |value: Balance| value.try_into().map_err(|_| RpcError {
code: ErrorCode::InvalidParams,
message: format!("{} doesn't fit in NumberOrHex representation", value),
data: None,
});

Ok(FeeDetails {
inclusion_fee: if let Some(inclusion_fee) = fee_details.inclusion_fee {
Some(InclusionFee {
base_fee: try_into_rpc_balance(inclusion_fee.base_fee)?,
len_fee: try_into_rpc_balance(inclusion_fee.len_fee)?,
adjusted_weight_fee: try_into_rpc_balance(inclusion_fee.adjusted_weight_fee)?,
})
} else {
None
},
tip: Default::default(),
})
}
}
Loading