diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs
index 87bf27e4ff18..f4836b7cdde1 100644
--- a/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs
+++ b/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs
@@ -13,12 +13,13 @@
// You should have received a copy of the GNU General Public License
// along with Polkadot. If not, see .
+#![cfg(feature = "runtime-benchmarks")]
use super::*;
use crate::{account_and_location, new_executor, EnsureDelivery, XcmCallOf};
use alloc::{vec, vec::Vec};
use codec::Encode;
-use frame_benchmarking::{benchmarks, BenchmarkError};
+use frame_benchmarking::v2::*;
use frame_support::traits::fungible::Inspect;
use xcm::{
latest::{prelude::*, MaxDispatchErrorLen, MaybeErrorCode, Weight, MAX_ITEMS_IN_ASSETS},
@@ -29,16 +30,21 @@ use xcm_executor::{
ExecutorError, FeesMode,
};
-benchmarks! {
- report_holding {
+#[benchmarks]
+mod benchmarks {
+ use super::*;
+
+ #[benchmark]
+ fn report_holding() -> Result<(), BenchmarkError> {
let (sender_account, sender_location) = account_and_location::(1);
let destination = T::valid_destination().map_err(|_| BenchmarkError::Skip)?;
- let (expected_fees_mode, expected_assets_in_holding) = T::DeliveryHelper::ensure_successful_delivery(
- &sender_location,
- &destination,
- FeeReason::Report,
- );
+ let (expected_fees_mode, expected_assets_in_holding) =
+ T::DeliveryHelper::ensure_successful_delivery(
+ &sender_location,
+ &destination,
+ FeeReason::Report,
+ );
let sender_account_balance_before = T::TransactAsset::balance(&sender_account);
// generate holding and add possible required fees
@@ -64,21 +70,33 @@ benchmarks! {
query_id: Default::default(),
max_weight: Weight::MAX,
},
- // Worst case is looking through all holdings for every asset explicitly - respecting the limit `MAX_ITEMS_IN_ASSETS`.
- assets: Definite(holding.into_inner().into_iter().take(MAX_ITEMS_IN_ASSETS).collect::>().into()),
+ // Worst case is looking through all holdings for every asset explicitly - respecting
+ // the limit `MAX_ITEMS_IN_ASSETS`.
+ assets: Definite(
+ holding
+ .into_inner()
+ .into_iter()
+ .take(MAX_ITEMS_IN_ASSETS)
+ .collect::>()
+ .into(),
+ ),
};
let xcm = Xcm(vec![instruction]);
- } : {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
// Check we charged the delivery fees
assert!(T::TransactAsset::balance(&sender_account) <= sender_account_balance_before);
+
+ Ok(())
}
// This benchmark does not use any additional orders or instructions. This should be managed
// by the `deep` and `shallow` implementation.
- buy_execution {
+ #[benchmark]
+ fn buy_execution() -> Result<(), BenchmarkError> {
let holding = T::worst_case_holding(0).into();
let mut executor = new_executor::(Default::default());
@@ -92,13 +110,16 @@ benchmarks! {
};
let xcm = Xcm(vec![instruction]);
- } : {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
+ Ok(())
}
- pay_fees {
+ #[benchmark]
+ fn pay_fees() -> Result<(), BenchmarkError> {
let holding = T::worst_case_holding(0).into();
let mut executor = new_executor::(Default::default());
@@ -111,40 +132,53 @@ benchmarks! {
let instruction = Instruction::>::PayFees { asset: fee_asset };
let xcm = Xcm(vec![instruction]);
- } : {
- executor.bench_process(xcm)?;
- } verify {}
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
+ Ok(())
+ }
- set_asset_claimer {
+ #[benchmark]
+ fn set_asset_claimer() -> Result<(), BenchmarkError> {
let mut executor = new_executor::(Default::default());
let (_, sender_location) = account_and_location::(1);
- let instruction = Instruction::SetAssetClaimer{ location:sender_location.clone() };
+ let instruction = Instruction::SetAssetClaimer { location: sender_location.clone() };
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
assert_eq!(executor.asset_claimer(), Some(sender_location.clone()));
+
+ Ok(())
}
- query_response {
+ #[benchmark]
+ fn query_response() -> Result<(), BenchmarkError> {
let mut executor = new_executor::(Default::default());
let (query_id, response) = T::worst_case_response();
let max_weight = Weight::MAX;
let querier: Option = Some(Here.into());
let instruction = Instruction::QueryResponse { query_id, response, max_weight, querier };
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
+
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
// The assert above is enough to show this XCM succeeded
+
+ Ok(())
}
// We don't care about the call itself, since that is accounted for in the weight parameter
// and included in the final weight calculation. So this is just the overhead of submitting
// a noop call.
- transact {
+ #[benchmark]
+ fn transact() -> Result<(), BenchmarkError> {
let (origin, noop_call) = T::transact_origin_and_runtime_call()?;
let mut executor = new_executor::(origin);
let double_encoded_noop_call: DoubleEncoded<_> = noop_call.encode().into();
@@ -154,119 +188,145 @@ benchmarks! {
call: double_encoded_noop_call,
};
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
// TODO Make the assertion configurable?
+
+ Ok(())
}
- refund_surplus {
+ #[benchmark]
+ fn refund_surplus() -> Result<(), BenchmarkError> {
let mut executor = new_executor::(Default::default());
let holding_assets = T::worst_case_holding(1);
// We can already buy execution since we'll load the holding register manually
let asset_for_fees = T::fee_asset().unwrap();
- let previous_xcm = Xcm(vec![BuyExecution { fees: asset_for_fees, weight_limit: Limited(Weight::from_parts(1337, 1337)) }]);
+ let previous_xcm = Xcm(vec![BuyExecution {
+ fees: asset_for_fees,
+ weight_limit: Limited(Weight::from_parts(1337, 1337)),
+ }]);
executor.set_holding(holding_assets.into());
executor.set_total_surplus(Weight::from_parts(1337, 1337));
executor.set_total_refunded(Weight::zero());
- executor.bench_process(previous_xcm).expect("Holding has been loaded, so we can buy execution here");
+ executor
+ .bench_process(previous_xcm)
+ .expect("Holding has been loaded, so we can buy execution here");
let instruction = Instruction::>::RefundSurplus;
let xcm = Xcm(vec![instruction]);
- } : {
- let result = executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ let _result = executor.bench_process(xcm)?;
+ }
assert_eq!(executor.total_surplus(), &Weight::from_parts(1337, 1337));
assert_eq!(executor.total_refunded(), &Weight::from_parts(1337, 1337));
+
+ Ok(())
}
- set_error_handler {
+ #[benchmark]
+ fn set_error_handler() -> Result<(), BenchmarkError> {
let mut executor = new_executor::(Default::default());
let instruction = Instruction::>::SetErrorHandler(Xcm(vec![]));
let xcm = Xcm(vec![instruction]);
- } : {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
assert_eq!(executor.error_handler(), &Xcm(vec![]));
+
+ Ok(())
}
- set_appendix {
+ #[benchmark]
+ fn set_appendix() -> Result<(), BenchmarkError> {
let mut executor = new_executor::(Default::default());
let appendix = Xcm(vec![]);
let instruction = Instruction::>::SetAppendix(appendix);
let xcm = Xcm(vec![instruction]);
- } : {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
assert_eq!(executor.appendix(), &Xcm(vec![]));
+ Ok(())
}
- clear_error {
+ #[benchmark]
+ fn clear_error() -> Result<(), BenchmarkError> {
let mut executor = new_executor::(Default::default());
executor.set_error(Some((5u32, XcmError::Overflow)));
let instruction = Instruction::>::ClearError;
let xcm = Xcm(vec![instruction]);
- } : {
- executor.bench_process(xcm)?;
- } verify {
- assert!(executor.error().is_none())
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
+ assert!(executor.error().is_none());
+ Ok(())
}
- descend_origin {
+ #[benchmark]
+ fn descend_origin() -> Result<(), BenchmarkError> {
let mut executor = new_executor::(Default::default());
let who = Junctions::from([OnlyChild, OnlyChild]);
let instruction = Instruction::DescendOrigin(who.clone());
let xcm = Xcm(vec![instruction]);
- } : {
- executor.bench_process(xcm)?;
- } verify {
- assert_eq!(
- executor.origin(),
- &Some(Location {
- parents: 0,
- interior: who,
- }),
- );
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
+ assert_eq!(executor.origin(), &Some(Location { parents: 0, interior: who }),);
+
+ Ok(())
}
- execute_with_origin {
+ #[benchmark]
+ fn execute_with_origin() -> Result<(), BenchmarkError> {
let mut executor = new_executor::(Default::default());
let who: Junctions = Junctions::from([AccountId32 { id: [0u8; 32], network: None }]);
- let instruction = Instruction::ExecuteWithOrigin { descendant_origin: Some(who.clone()), xcm: Xcm(vec![]) };
+ let instruction = Instruction::ExecuteWithOrigin {
+ descendant_origin: Some(who.clone()),
+ xcm: Xcm(vec![]),
+ };
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
- assert_eq!(
- executor.origin(),
- &Some(Location {
- parents: 0,
- interior: Here,
- }),
- );
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
+ assert_eq!(executor.origin(), &Some(Location { parents: 0, interior: Here }),);
+
+ Ok(())
}
- clear_origin {
+ #[benchmark]
+ fn clear_origin() -> Result<(), BenchmarkError> {
let mut executor = new_executor::(Default::default());
let instruction = Instruction::ClearOrigin;
let xcm = Xcm(vec![instruction]);
- } : {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
assert_eq!(executor.origin(), &None);
+ Ok(())
}
- report_error {
+ #[benchmark]
+ fn report_error() -> Result<(), BenchmarkError> {
let (sender_account, sender_location) = account_and_location::(1);
let query_id = Default::default();
let max_weight = Default::default();
let destination = T::valid_destination().map_err(|_| BenchmarkError::Skip)?;
- let (expected_fees_mode, expected_assets_in_holding) = T::DeliveryHelper::ensure_successful_delivery(
- &sender_location,
- &destination,
- FeeReason::Report,
- );
+ let (expected_fees_mode, expected_assets_in_holding) =
+ T::DeliveryHelper::ensure_successful_delivery(
+ &sender_location,
+ &destination,
+ FeeReason::Report,
+ );
let sender_account_balance_before = T::TransactAsset::balance(&sender_account);
let mut executor = new_executor::(sender_location);
@@ -278,18 +338,21 @@ benchmarks! {
}
executor.set_error(Some((0u32, XcmError::Unimplemented)));
- let instruction = Instruction::ReportError(QueryResponseInfo {
- query_id, destination, max_weight
- });
+ let instruction =
+ Instruction::ReportError(QueryResponseInfo { query_id, destination, max_weight });
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
// Check we charged the delivery fees
assert!(T::TransactAsset::balance(&sender_account) <= sender_account_balance_before);
+
+ Ok(())
}
- claim_asset {
+ #[benchmark]
+ fn claim_asset() -> Result<(), BenchmarkError> {
use xcm_executor::traits::DropAssets;
let (origin, ticket, assets) = T::claimable_asset()?;
@@ -298,11 +361,7 @@ benchmarks! {
::AssetTrap::drop_assets(
&origin,
assets.clone().into(),
- &XcmContext {
- origin: Some(origin.clone()),
- message_id: [0; 32],
- topic: None,
- },
+ &XcmContext { origin: Some(origin.clone()), message_id: [0; 32], topic: None },
);
// Assets should be in the trap now.
@@ -310,28 +369,32 @@ benchmarks! {
let mut executor = new_executor::(origin);
let instruction = Instruction::ClaimAsset { assets: assets.clone(), ticket };
let xcm = Xcm(vec![instruction]);
- } :{
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
assert!(executor.holding().ensure_contains(&assets).is_ok());
+ Ok(())
}
- trap {
+ #[benchmark]
+ fn trap() -> Result<(), BenchmarkError> {
let mut executor = new_executor::(Default::default());
let instruction = Instruction::Trap(10);
let xcm = Xcm(vec![instruction]);
// In order to access result in the verification below, it needs to be defined here.
- let mut _result = Ok(());
- } : {
- _result = executor.bench_process(xcm);
- } verify {
- assert!(matches!(_result, Err(ExecutorError {
- xcm_error: XcmError::Trap(10),
- ..
- })));
+ let result;
+ #[block]
+ {
+ result = executor.bench_process(xcm);
+ }
+ assert!(matches!(result, Err(ExecutorError { xcm_error: XcmError::Trap(10), .. })));
+
+ Ok(())
}
- subscribe_version {
+ #[benchmark]
+ fn subscribe_version() -> Result<(), BenchmarkError> {
use xcm_executor::traits::VersionChangeNotifier;
let origin = T::subscribe_origin()?;
let query_id = Default::default();
@@ -339,13 +402,18 @@ benchmarks! {
let mut executor = new_executor::(origin.clone());
let instruction = Instruction::SubscribeVersion { query_id, max_response_weight };
let xcm = Xcm(vec![instruction]);
- } : {
- executor.bench_process(xcm)?;
- } verify {
- assert!(::SubscriptionService::is_subscribed(&origin));
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
+ assert!(::SubscriptionService::is_subscribed(
+ &origin
+ ));
+ Ok(())
}
- unsubscribe_version {
+ #[benchmark]
+ fn unsubscribe_version() -> Result<(), BenchmarkError> {
use xcm_executor::traits::VersionChangeNotifier;
// First we need to subscribe to notifications.
let (origin, _) = T::transact_origin_and_runtime_call()?;
@@ -355,24 +423,28 @@ benchmarks! {
&origin,
query_id,
max_response_weight,
- &XcmContext {
- origin: Some(origin.clone()),
- message_id: [0; 32],
- topic: None,
- },
- ).map_err(|_| "Could not start subscription")?;
- assert!(::SubscriptionService::is_subscribed(&origin));
+ &XcmContext { origin: Some(origin.clone()), message_id: [0; 32], topic: None },
+ )
+ .map_err(|_| "Could not start subscription")?;
+ assert!(::SubscriptionService::is_subscribed(
+ &origin
+ ));
let mut executor = new_executor::(origin.clone());
let instruction = Instruction::UnsubscribeVersion;
let xcm = Xcm(vec![instruction]);
- } : {
- executor.bench_process(xcm)?;
- } verify {
- assert!(!::SubscriptionService::is_subscribed(&origin));
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
+ assert!(!::SubscriptionService::is_subscribed(
+ &origin
+ ));
+ Ok(())
}
- burn_asset {
+ #[benchmark]
+ fn burn_asset() -> Result<(), BenchmarkError> {
let holding = T::worst_case_holding(0);
let assets = holding.clone();
@@ -381,13 +453,16 @@ benchmarks! {
let instruction = Instruction::BurnAsset(assets.into());
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
assert!(executor.holding().is_empty());
+ Ok(())
}
- expect_asset {
+ #[benchmark]
+ fn expect_asset() -> Result<(), BenchmarkError> {
let holding = T::worst_case_holding(0);
let assets = holding.clone();
@@ -396,71 +471,86 @@ benchmarks! {
let instruction = Instruction::ExpectAsset(assets.into());
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
// `execute` completing successfully is as good as we can check.
+
+ Ok(())
}
- expect_origin {
+ #[benchmark]
+ fn expect_origin() -> Result<(), BenchmarkError> {
let expected_origin = Parent.into();
let mut executor = new_executor::(Default::default());
let instruction = Instruction::ExpectOrigin(Some(expected_origin));
let xcm = Xcm(vec![instruction]);
let mut _result = Ok(());
- }: {
- _result = executor.bench_process(xcm);
- } verify {
- assert!(matches!(_result, Err(ExecutorError {
- xcm_error: XcmError::ExpectationFalse,
- ..
- })));
+ #[block]
+ {
+ _result = executor.bench_process(xcm);
+ }
+ assert!(matches!(
+ _result,
+ Err(ExecutorError { xcm_error: XcmError::ExpectationFalse, .. })
+ ));
+
+ Ok(())
}
- expect_error {
+ #[benchmark]
+ fn expect_error() -> Result<(), BenchmarkError> {
let mut executor = new_executor::(Default::default());
executor.set_error(Some((3u32, XcmError::Overflow)));
let instruction = Instruction::ExpectError(None);
let xcm = Xcm(vec![instruction]);
let mut _result = Ok(());
- }: {
- _result = executor.bench_process(xcm);
- } verify {
- assert!(matches!(_result, Err(ExecutorError {
- xcm_error: XcmError::ExpectationFalse,
- ..
- })));
+ #[block]
+ {
+ _result = executor.bench_process(xcm);
+ }
+ assert!(matches!(
+ _result,
+ Err(ExecutorError { xcm_error: XcmError::ExpectationFalse, .. })
+ ));
+
+ Ok(())
}
- expect_transact_status {
+ #[benchmark]
+ fn expect_transact_status() -> Result<(), BenchmarkError> {
let mut executor = new_executor::(Default::default());
- let worst_error = || -> MaybeErrorCode {
- vec![0; MaxDispatchErrorLen::get() as usize].into()
- };
+ let worst_error =
+ || -> MaybeErrorCode { vec![0; MaxDispatchErrorLen::get() as usize].into() };
executor.set_transact_status(worst_error());
let instruction = Instruction::ExpectTransactStatus(worst_error());
let xcm = Xcm(vec![instruction]);
let mut _result = Ok(());
- }: {
- _result = executor.bench_process(xcm);
- } verify {
+ #[block]
+ {
+ _result = executor.bench_process(xcm);
+ }
assert!(matches!(_result, Ok(..)));
+ Ok(())
}
- query_pallet {
+ #[benchmark]
+ fn query_pallet() -> Result<(), BenchmarkError> {
let (sender_account, sender_location) = account_and_location::(1);
let query_id = Default::default();
let destination = T::valid_destination().map_err(|_| BenchmarkError::Skip)?;
let max_weight = Default::default();
- let (expected_fees_mode, expected_assets_in_holding) = T::DeliveryHelper::ensure_successful_delivery(
- &sender_location,
- &destination,
- FeeReason::QueryPallet,
- );
+ let (expected_fees_mode, expected_assets_in_holding) =
+ T::DeliveryHelper::ensure_successful_delivery(
+ &sender_location,
+ &destination,
+ FeeReason::QueryPallet,
+ );
let sender_account_balance_before = T::TransactAsset::balance(&sender_account);
let mut executor = new_executor::(sender_location);
if let Some(expected_fees_mode) = expected_fees_mode {
@@ -476,15 +566,19 @@ benchmarks! {
response_info: QueryResponseInfo { destination, query_id, max_weight },
};
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
// Check we charged the delivery fees
assert!(T::TransactAsset::balance(&sender_account) <= sender_account_balance_before);
// TODO: Potentially add new trait to XcmSender to detect a queued outgoing message. #4426
+
+ Ok(())
}
- expect_pallet {
+ #[benchmark]
+ fn expect_pallet() -> Result<(), BenchmarkError> {
let mut executor = new_executor::(Default::default());
let valid_pallet = T::valid_pallet();
let instruction = Instruction::ExpectPallet {
@@ -495,23 +589,27 @@ benchmarks! {
min_crate_minor: valid_pallet.crate_version.minor.into(),
};
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
// the execution succeeding is all we need to verify this xcm was successful
+ Ok(())
}
- report_transact_status {
+ #[benchmark]
+ fn report_transact_status() -> Result<(), BenchmarkError> {
let (sender_account, sender_location) = account_and_location::(1);
let query_id = Default::default();
let destination = T::valid_destination().map_err(|_| BenchmarkError::Skip)?;
let max_weight = Default::default();
- let (expected_fees_mode, expected_assets_in_holding) = T::DeliveryHelper::ensure_successful_delivery(
- &sender_location,
- &destination,
- FeeReason::Report,
- );
+ let (expected_fees_mode, expected_assets_in_holding) =
+ T::DeliveryHelper::ensure_successful_delivery(
+ &sender_location,
+ &destination,
+ FeeReason::Report,
+ );
let sender_account_balance_before = T::TransactAsset::balance(&sender_account);
let mut executor = new_executor::(sender_location);
@@ -529,84 +627,102 @@ benchmarks! {
max_weight,
});
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
// Check we charged the delivery fees
assert!(T::TransactAsset::balance(&sender_account) <= sender_account_balance_before);
// TODO: Potentially add new trait to XcmSender to detect a queued outgoing message. #4426
+ Ok(())
}
- clear_transact_status {
+ #[benchmark]
+ fn clear_transact_status() -> Result<(), BenchmarkError> {
let mut executor = new_executor::(Default::default());
executor.set_transact_status(b"MyError".to_vec().into());
let instruction = Instruction::ClearTransactStatus;
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
assert_eq!(executor.transact_status(), &MaybeErrorCode::Success);
+ Ok(())
}
- set_topic {
+ #[benchmark]
+ fn set_topic() -> Result<(), BenchmarkError> {
let mut executor = new_executor::(Default::default());
let instruction = Instruction::SetTopic([1; 32]);
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
assert_eq!(executor.topic(), &Some([1; 32]));
+ Ok(())
}
- clear_topic {
+ #[benchmark]
+ fn clear_topic() -> Result<(), BenchmarkError> {
let mut executor = new_executor::(Default::default());
executor.set_topic(Some([2; 32]));
let instruction = Instruction::ClearTopic;
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
assert_eq!(executor.topic(), &None);
+ Ok(())
}
- exchange_asset {
+ #[benchmark]
+ fn exchange_asset() -> Result<(), BenchmarkError> {
let (give, want) = T::worst_case_asset_exchange().map_err(|_| BenchmarkError::Skip)?;
let assets = give.clone();
let mut executor = new_executor::(Default::default());
executor.set_holding(give.into());
- let instruction = Instruction::ExchangeAsset {
- give: assets.into(),
- want: want.clone(),
- maximal: true,
- };
+ let instruction =
+ Instruction::ExchangeAsset { give: assets.into(), want: want.clone(), maximal: true };
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
assert_eq!(executor.holding(), &want.into());
+ Ok(())
}
- universal_origin {
+ #[benchmark]
+ fn universal_origin() -> Result<(), BenchmarkError> {
let (origin, alias) = T::universal_alias().map_err(|_| BenchmarkError::Skip)?;
let mut executor = new_executor::(origin);
let instruction = Instruction::UniversalOrigin(alias);
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
use frame_support::traits::Get;
let universal_location = ::UniversalLocation::get();
- assert_eq!(executor.origin(), &Some(Junctions::from([alias]).relative_to(&universal_location)));
+ assert_eq!(
+ executor.origin(),
+ &Some(Junctions::from([alias]).relative_to(&universal_location))
+ );
+
+ Ok(())
}
- export_message {
- let x in 1 .. 1000;
+ #[benchmark]
+ fn export_message(x: Linear<1, 1000>) -> Result<(), BenchmarkError> {
// The `inner_xcm` influences `ExportMessage` total weight based on
// `inner_xcm.encoded_size()`, so for this benchmark use smallest encoded instruction
// to approximate weight per "unit" of encoded size; then actual weight can be estimated
@@ -616,11 +732,12 @@ benchmarks! {
// Get `origin`, `network` and `destination` from configured runtime.
let (origin, network, destination) = T::export_message_origin_and_destination()?;
- let (expected_fees_mode, expected_assets_in_holding) = T::DeliveryHelper::ensure_successful_delivery(
- &origin,
- &destination.clone().into(),
- FeeReason::Export { network, destination: destination.clone() },
- );
+ let (expected_fees_mode, expected_assets_in_holding) =
+ T::DeliveryHelper::ensure_successful_delivery(
+ &origin,
+ &destination.clone().into(),
+ FeeReason::Export { network, destination: destination.clone() },
+ );
let sender_account = T::AccountIdConverter::convert_location(&origin).unwrap();
let sender_account_balance_before = T::TransactAsset::balance(&sender_account);
@@ -631,37 +748,39 @@ benchmarks! {
if let Some(expected_assets_in_holding) = expected_assets_in_holding {
executor.set_holding(expected_assets_in_holding.into());
}
- let xcm = Xcm(vec![ExportMessage {
- network, destination: destination.clone(), xcm: inner_xcm,
- }]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
+ let xcm =
+ Xcm(vec![ExportMessage { network, destination: destination.clone(), xcm: inner_xcm }]);
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
// Check we charged the delivery fees
assert!(T::TransactAsset::balance(&sender_account) <= sender_account_balance_before);
// TODO: Potentially add new trait to XcmSender to detect a queued outgoing message. #4426
+ Ok(())
}
- set_fees_mode {
+ #[benchmark]
+ fn set_fees_mode() -> Result<(), BenchmarkError> {
let mut executor = new_executor::(Default::default());
executor.set_fees_mode(FeesMode { jit_withdraw: false });
let instruction = Instruction::SetFeesMode { jit_withdraw: true };
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
assert_eq!(executor.fees_mode(), &FeesMode { jit_withdraw: true });
+ Ok(())
}
- lock_asset {
+ #[benchmark]
+ fn lock_asset() -> Result<(), BenchmarkError> {
let (unlocker, owner, asset) = T::unlockable_asset()?;
- let (expected_fees_mode, expected_assets_in_holding) = T::DeliveryHelper::ensure_successful_delivery(
- &owner,
- &unlocker,
- FeeReason::LockAsset,
- );
+ let (expected_fees_mode, expected_assets_in_holding) =
+ T::DeliveryHelper::ensure_successful_delivery(&owner, &unlocker, FeeReason::LockAsset);
let sender_account = T::AccountIdConverter::convert_location(&owner).unwrap();
let sender_account_balance_before = T::TransactAsset::balance(&sender_account);
@@ -681,15 +800,18 @@ benchmarks! {
let instruction = Instruction::LockAsset { asset, unlocker };
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
// Check delivery fees
assert!(T::TransactAsset::balance(&sender_account) <= sender_account_balance_before);
// TODO: Potentially add new trait to XcmSender to detect a queued outgoing message. #4426
+ Ok(())
}
- unlock_asset {
+ #[benchmark]
+ fn unlock_asset() -> Result<(), BenchmarkError> {
use xcm_executor::traits::{AssetLock, Enact};
let (unlocker, owner, asset) = T::unlockable_asset()?;
@@ -709,13 +831,15 @@ benchmarks! {
// ... then unlock them with the UnlockAsset instruction.
let instruction = Instruction::UnlockAsset { asset, target: owner };
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
-
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
+ Ok(())
}
- note_unlockable {
+ #[benchmark]
+ fn note_unlockable() -> Result<(), BenchmarkError> {
use xcm_executor::traits::{AssetLock, Enact};
let (unlocker, owner, asset) = T::unlockable_asset()?;
@@ -735,13 +859,15 @@ benchmarks! {
// ... then note them as unlockable with the NoteUnlockable instruction.
let instruction = Instruction::NoteUnlockable { asset, owner };
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
-
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
+ Ok(())
}
- request_unlock {
+ #[benchmark]
+ fn request_unlock() -> Result<(), BenchmarkError> {
use xcm_executor::traits::{AssetLock, Enact};
let (locker, owner, asset) = T::unlockable_asset()?;
@@ -756,11 +882,12 @@ benchmarks! {
.enact()
.map_err(|_| BenchmarkError::Skip)?;
- let (expected_fees_mode, expected_assets_in_holding) = T::DeliveryHelper::ensure_successful_delivery(
- &owner,
- &locker,
- FeeReason::RequestUnlock,
- );
+ let (expected_fees_mode, expected_assets_in_holding) =
+ T::DeliveryHelper::ensure_successful_delivery(
+ &owner,
+ &locker,
+ FeeReason::RequestUnlock,
+ );
let sender_account = T::AccountIdConverter::convert_location(&owner).unwrap();
let sender_account_balance_before = T::TransactAsset::balance(&sender_account);
@@ -774,15 +901,18 @@ benchmarks! {
}
let instruction = Instruction::RequestUnlock { asset, locker };
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
// Check we charged the delivery fees
assert!(T::TransactAsset::balance(&sender_account) <= sender_account_balance_before);
// TODO: Potentially add new trait to XcmSender to detect a queued outgoing message. #4426
+ Ok(())
}
- unpaid_execution {
+ #[benchmark]
+ fn unpaid_execution() -> Result<(), BenchmarkError> {
let mut executor = new_executor::(Default::default());
executor.set_origin(Some(Here.into()));
@@ -792,21 +922,27 @@ benchmarks! {
};
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
+ Ok(())
}
- alias_origin {
+ #[benchmark]
+ fn alias_origin() -> Result<(), BenchmarkError> {
let (origin, target) = T::alias_origin().map_err(|_| BenchmarkError::Skip)?;
let mut executor = new_executor::(origin);
let instruction = Instruction::AliasOrigin(target.clone());
let xcm = Xcm(vec![instruction]);
- }: {
- executor.bench_process(xcm)?;
- } verify {
+ #[block]
+ {
+ executor.bench_process(xcm)?;
+ }
assert_eq!(executor.origin(), &Some(target));
+ Ok(())
}
impl_benchmark_test_suite!(
diff --git a/prdoc/pr_6695.prdoc b/prdoc/pr_6695.prdoc
new file mode 100644
index 000000000000..7a950e8546cd
--- /dev/null
+++ b/prdoc/pr_6695.prdoc
@@ -0,0 +1,8 @@
+title: '[pallet-revive] bugfix decoding 64bit args in the decoder'
+doc:
+- audience: Runtime Dev
+ description: The argument index of the next argument is dictated by the size of
+ the current one.
+crates:
+- name: pallet-revive-proc-macro
+ bump: patch
diff --git a/substrate/frame/revive/proc-macro/src/lib.rs b/substrate/frame/revive/proc-macro/src/lib.rs
index 012b4bfab9a9..7232c6342824 100644
--- a/substrate/frame/revive/proc-macro/src/lib.rs
+++ b/substrate/frame/revive/proc-macro/src/lib.rs
@@ -342,7 +342,8 @@ where
const ALLOWED_REGISTERS: u32 = 6;
let mut registers_used = 0;
let mut bindings = vec![];
- for (idx, (name, ty)) in param_names.clone().zip(param_types.clone()).enumerate() {
+ let mut idx = 0;
+ for (name, ty) in param_names.clone().zip(param_types.clone()) {
let syn::Type::Path(path) = &**ty else {
panic!("Type needs to be path");
};
@@ -380,6 +381,7 @@ where
}
};
bindings.push(binding);
+ idx += size;
}
quote! {
#( #bindings )*
diff --git a/substrate/frame/state-trie-migration/src/lib.rs b/substrate/frame/state-trie-migration/src/lib.rs
index 3fe5abb81031..61323b70b33d 100644
--- a/substrate/frame/state-trie-migration/src/lib.rs
+++ b/substrate/frame/state-trie-migration/src/lib.rs
@@ -249,13 +249,13 @@ pub mod pallet {
if limits.item.is_zero() || limits.size.is_zero() {
// handle this minor edge case, else we would call `migrate_tick` at least once.
log!(warn, "limits are zero. stopping");
- return Ok(())
+ return Ok(());
}
while !self.exhausted(limits) && !self.finished() {
if let Err(e) = self.migrate_tick() {
log!(error, "migrate_until_exhaustion failed: {:?}", e);
- return Err(e)
+ return Err(e);
}
}
@@ -332,7 +332,7 @@ pub mod pallet {
_ => {
// defensive: there must be an ongoing top migration.
frame_support::defensive!("cannot migrate child key.");
- return Ok(())
+ return Ok(());
},
};
@@ -374,7 +374,7 @@ pub mod pallet {
Progress::Complete => {
// defensive: there must be an ongoing top migration.
frame_support::defensive!("cannot migrate top key.");
- return Ok(())
+ return Ok(());
},
};
@@ -669,7 +669,7 @@ pub mod pallet {
// ensure that the migration witness data was correct.
if real_size_upper < task.dyn_size {
Self::slash(who, deposit)?;
- return Ok(().into())
+ return Ok(().into());
}
Self::deposit_event(Event::::Migrated {
@@ -957,6 +957,7 @@ pub mod pallet {
mod benchmarks {
use super::{pallet::Pallet as StateTrieMigration, *};
use alloc::vec;
+ use frame_benchmarking::v2::*;
use frame_support::traits::fungible::{Inspect, Mutate};
// The size of the key seemingly makes no difference in the read/write time, so we make it
@@ -970,8 +971,12 @@ mod benchmarks {
stash
}
- frame_benchmarking::benchmarks! {
- continue_migrate {
+ #[benchmarks]
+ mod inner_benchmarks {
+ use super::*;
+
+ #[benchmark]
+ fn continue_migrate() -> Result<(), BenchmarkError> {
// note that this benchmark should migrate nothing, as we only want the overhead weight
// of the bookkeeping, and the migration cost itself is noted via the `dynamic_weight`
// function.
@@ -980,116 +985,151 @@ mod benchmarks {
let stash = set_balance_for_deposit::(&caller, null.item);
// Allow signed migrations.
SignedMigrationMaxLimits::::put(MigrationLimits { size: 1024, item: 5 });
- }: _(frame_system::RawOrigin::Signed(caller.clone()), null, 0, StateTrieMigration::::migration_process())
- verify {
+
+ #[extrinsic_call]
+ _(
+ frame_system::RawOrigin::Signed(caller.clone()),
+ null,
+ 0,
+ StateTrieMigration::::migration_process(),
+ );
+
assert_eq!(StateTrieMigration::::migration_process(), Default::default());
- assert_eq!(T::Currency::balance(&caller), stash)
+ assert_eq!(T::Currency::balance(&caller), stash);
+
+ Ok(())
}
- continue_migrate_wrong_witness {
+ #[benchmark]
+ fn continue_migrate_wrong_witness() -> Result<(), BenchmarkError> {
let null = MigrationLimits::default();
let caller = frame_benchmarking::whitelisted_caller();
- let bad_witness = MigrationTask { progress_top: Progress::LastKey(vec![1u8].try_into().unwrap()), ..Default::default() };
- }: {
- assert!(
- StateTrieMigration::::continue_migrate(
+ let bad_witness = MigrationTask {
+ progress_top: Progress::LastKey(vec![1u8].try_into().unwrap()),
+ ..Default::default()
+ };
+ #[block]
+ {
+ assert!(StateTrieMigration::::continue_migrate(
frame_system::RawOrigin::Signed(caller).into(),
null,
0,
bad_witness,
)
- .is_err()
- )
- }
- verify {
- assert_eq!(StateTrieMigration::::migration_process(), Default::default())
+ .is_err());
+ }
+
+ assert_eq!(StateTrieMigration::::migration_process(), Default::default());
+
+ Ok(())
}
- migrate_custom_top_success {
+ #[benchmark]
+ fn migrate_custom_top_success() -> Result<(), BenchmarkError> {
let null = MigrationLimits::default();
let caller: T::AccountId = frame_benchmarking::whitelisted_caller();
let stash = set_balance_for_deposit::(&caller, null.item);
- }: migrate_custom_top(frame_system::RawOrigin::Signed(caller.clone()), Default::default(), 0)
- verify {
+ #[extrinsic_call]
+ migrate_custom_top(
+ frame_system::RawOrigin::Signed(caller.clone()),
+ Default::default(),
+ 0,
+ );
+
assert_eq!(StateTrieMigration::::migration_process(), Default::default());
- assert_eq!(T::Currency::balance(&caller), stash)
+ assert_eq!(T::Currency::balance(&caller), stash);
+ Ok(())
}
- migrate_custom_top_fail {
+ #[benchmark]
+ fn migrate_custom_top_fail() -> Result<(), BenchmarkError> {
let null = MigrationLimits::default();
let caller: T::AccountId = frame_benchmarking::whitelisted_caller();
let stash = set_balance_for_deposit::(&caller, null.item);
// for tests, we need to make sure there is _something_ in storage that is being
// migrated.
- sp_io::storage::set(b"foo", vec![1u8;33].as_ref());
- }: {
- assert!(
- StateTrieMigration::::migrate_custom_top(
+ sp_io::storage::set(b"foo", vec![1u8; 33].as_ref());
+ #[block]
+ {
+ assert!(StateTrieMigration::::migrate_custom_top(
frame_system::RawOrigin::Signed(caller.clone()).into(),
vec![b"foo".to_vec()],
1,
- ).is_ok()
- );
+ )
+ .is_ok());
+
+ frame_system::Pallet::::assert_last_event(
+ ::RuntimeEvent::from(crate::Event::Slashed {
+ who: caller.clone(),
+ amount: StateTrieMigration::::calculate_deposit_for(1u32),
+ })
+ .into(),
+ );
+ }
- frame_system::Pallet::::assert_last_event(
- ::RuntimeEvent::from(crate::Event::Slashed {
- who: caller.clone(),
- amount: StateTrieMigration::::calculate_deposit_for(1u32),
- }).into(),
- );
- }
- verify {
assert_eq!(StateTrieMigration::::migration_process(), Default::default());
// must have gotten slashed
- assert!(T::Currency::balance(&caller) < stash)
+ assert!(T::Currency::balance(&caller) < stash);
+
+ Ok(())
}
- migrate_custom_child_success {
+ #[benchmark]
+ fn migrate_custom_child_success() -> Result<(), BenchmarkError> {
let caller: T::AccountId = frame_benchmarking::whitelisted_caller();
let stash = set_balance_for_deposit::(&caller, 0);
- }: migrate_custom_child(
- frame_system::RawOrigin::Signed(caller.clone()),
- StateTrieMigration::::childify(Default::default()),
- Default::default(),
- 0
- )
- verify {
+
+ #[extrinsic_call]
+ migrate_custom_child(
+ frame_system::RawOrigin::Signed(caller.clone()),
+ StateTrieMigration::::childify(Default::default()),
+ Default::default(),
+ 0,
+ );
+
assert_eq!(StateTrieMigration::::migration_process(), Default::default());
assert_eq!(T::Currency::balance(&caller), stash);
+
+ Ok(())
}
- migrate_custom_child_fail {
+ #[benchmark]
+ fn migrate_custom_child_fail() -> Result<(), BenchmarkError> {
let caller: T::AccountId = frame_benchmarking::whitelisted_caller();
let stash = set_balance_for_deposit::(&caller, 1);
// for tests, we need to make sure there is _something_ in storage that is being
// migrated.
- sp_io::default_child_storage::set(b"top", b"foo", vec![1u8;33].as_ref());
- }: {
- assert!(
- StateTrieMigration::::migrate_custom_child(
+ sp_io::default_child_storage::set(b"top", b"foo", vec![1u8; 33].as_ref());
+
+ #[block]
+ {
+ assert!(StateTrieMigration::::migrate_custom_child(
frame_system::RawOrigin::Signed(caller.clone()).into(),
StateTrieMigration::::childify("top"),
vec![b"foo".to_vec()],
1,
- ).is_ok()
- )
- }
- verify {
+ )
+ .is_ok());
+ }
assert_eq!(StateTrieMigration::::migration_process(), Default::default());
// must have gotten slashed
- assert!(T::Currency::balance(&caller) < stash)
+ assert!(T::Currency::balance(&caller) < stash);
+ Ok(())
}
- process_top_key {
- let v in 1 .. (4 * 1024 * 1024);
-
+ #[benchmark]
+ fn process_top_key(v: Linear<1, { 4 * 1024 * 1024 }>) -> Result<(), BenchmarkError> {
let value = alloc::vec![1u8; v as usize];
sp_io::storage::set(KEY, &value);
- }: {
- let data = sp_io::storage::get(KEY).unwrap();
- sp_io::storage::set(KEY, &data);
- let _next = sp_io::storage::next_key(KEY);
- assert_eq!(data, value);
+ #[block]
+ {
+ let data = sp_io::storage::get(KEY).unwrap();
+ sp_io::storage::set(KEY, &data);
+ let _next = sp_io::storage::next_key(KEY);
+ assert_eq!(data, value);
+ }
+
+ Ok(())
}
impl_benchmark_test_suite!(
@@ -1741,7 +1781,7 @@ pub(crate) mod remote_tests {
let ((finished, weight), proof) = ext.execute_and_prove(|| {
let weight = run_to_block::(now + One::one()).1;
if StateTrieMigration::::migration_process().finished() {
- return (true, weight)
+ return (true, weight);
}
duration += One::one();
now += One::one();
@@ -1768,7 +1808,7 @@ pub(crate) mod remote_tests {
ext.commit_all().unwrap();
if finished {
- break
+ break;
}
}