From 240e20b95d39874d7c996989d225e50f21702d7f Mon Sep 17 00:00:00 2001
From: "paritytech-cmd-bot-polkadot-sdk[bot]"
 <179002856+paritytech-cmd-bot-polkadot-sdk[bot]@users.noreply.github.com>
Date: Mon, 7 Oct 2024 19:45:56 +0200
Subject: [PATCH] [stable2407] Backport #5713 (#5739)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Backport #5713 into `stable2407` from bkchr.

See the
[documentation](https://github.com/paritytech/polkadot-sdk/blob/master/docs/BACKPORT.md)
on how to use this bot.

<!--
  # To be used by other automation, do not modify:
  original-pr-number: #${pull_number}
-->

---------

Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io>
Co-authored-by: Bastian Köcher <git@kchr.de>
Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io>
---
 prdoc/pr_5713.prdoc                          | 10 +++++++
 substrate/frame/treasury/src/benchmarking.rs | 31 +++++++++++++++-----
 2 files changed, 33 insertions(+), 8 deletions(-)
 create mode 100644 prdoc/pr_5713.prdoc

diff --git a/prdoc/pr_5713.prdoc b/prdoc/pr_5713.prdoc
new file mode 100644
index 00000000000..54d3619cdca
--- /dev/null
+++ b/prdoc/pr_5713.prdoc
@@ -0,0 +1,10 @@
+title: "pallet-treasury: Improve `remove_approval` benchmark"
+
+doc:
+  - audience: Runtime Dev
+    description: |
+      Fix the `remove_approval` benchmark when `SpendOrigin` doesn't return any `succesful_origin`.
+
+crates:
+  - name: pallet-treasury
+    bump: patch
diff --git a/substrate/frame/treasury/src/benchmarking.rs b/substrate/frame/treasury/src/benchmarking.rs
index 63978c94e68..95bf6329904 100644
--- a/substrate/frame/treasury/src/benchmarking.rs
+++ b/substrate/frame/treasury/src/benchmarking.rs
@@ -26,7 +26,7 @@ use frame_benchmarking::{
 	v2::*,
 };
 use frame_support::{
-	ensure,
+	assert_err, assert_ok, ensure,
 	traits::{
 		tokens::{ConversionFromAssetBalance, PaymentStatus},
 		EnsureOrigin, OnInitialize,
@@ -126,16 +126,31 @@ mod benchmarks {
 
 	#[benchmark]
 	fn remove_approval() -> Result<(), BenchmarkError> {
-		let origin =
-			T::SpendOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
-		let (_, value, beneficiary_lookup) = setup_proposal::<T, _>(SEED);
-		Treasury::<T, _>::spend_local(origin, value, beneficiary_lookup)?;
-		let proposal_id = Treasury::<T, _>::proposal_count() - 1;
+		let (spend_exists, proposal_id) =
+			if let Ok(origin) = T::SpendOrigin::try_successful_origin() {
+				let (_, value, beneficiary_lookup) = setup_proposal::<T, _>(SEED);
+				Treasury::<T, _>::spend_local(origin, value, beneficiary_lookup)?;
+				let proposal_id = Treasury::<T, _>::proposal_count() - 1;
+
+				(true, proposal_id)
+			} else {
+				(false, 0)
+			};
+
 		let reject_origin =
 			T::RejectOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
 
-		#[extrinsic_call]
-		_(reject_origin as T::RuntimeOrigin, proposal_id);
+		#[block]
+		{
+			let res =
+				Treasury::<T, _>::remove_approval(reject_origin as T::RuntimeOrigin, proposal_id);
+
+			if spend_exists {
+				assert_ok!(res);
+			} else {
+				assert_err!(res, Error::<T, _>::ProposalNotApproved);
+			}
+		}
 
 		Ok(())
 	}
-- 
GitLab