From 2bb2b7dfee8c35db877ff09171e311015cc603d5 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: Tue, 15 Oct 2024 20:04:45 +0300
Subject: [PATCH] [stable2409] Backport #5599 (#6069)

Backport #5599 into `stable2409` from franciscoaguirre.

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}
-->

---------

Co-authored-by: Francisco Aguirre <franciscoaguirreperez@gmail.com>
---
 .../assets/asset-hub-rococo/src/lib.rs        | 18 +++++++++++++++++-
 .../assets/asset-hub-westend/src/lib.rs       | 18 +++++++++++++++++-
 prdoc/pr_6069.prdoc                           | 19 +++++++++++++++++++
 3 files changed, 53 insertions(+), 2 deletions(-)
 create mode 100644 prdoc/pr_6069.prdoc

diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs
index 679f8fe143b..474cbed1f06 100644
--- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs
+++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs
@@ -1325,7 +1325,23 @@ impl_runtime_apis! {
 
 	impl xcm_runtime_apis::fees::XcmPaymentApi<Block> for Runtime {
 		fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result<Vec<VersionedAssetId>, XcmPaymentApiError> {
-			let acceptable_assets = vec![AssetId(xcm_config::TokenLocation::get())];
+			let native_token = xcm_config::TokenLocation::get();
+			// We accept the native token to pay fees.
+			let mut acceptable_assets = vec![AssetId(native_token.clone())];
+			// We also accept all assets in a pool with the native token.
+			acceptable_assets.extend(
+				pallet_asset_conversion::Pools::<Runtime>::iter_keys().filter_map(
+					|(asset_1, asset_2)| {
+						if asset_1 == native_token {
+							Some(asset_2.clone().into())
+						} else if asset_2 == native_token {
+							Some(asset_1.clone().into())
+						} else {
+							None
+						}
+					},
+				),
+			);
 			PolkadotXcm::query_acceptable_payment_assets(xcm_version, acceptable_assets)
 		}
 
diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs
index 676e55658a3..97711575620 100644
--- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs
+++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs
@@ -1358,7 +1358,23 @@ impl_runtime_apis! {
 
 	impl xcm_runtime_apis::fees::XcmPaymentApi<Block> for Runtime {
 		fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result<Vec<VersionedAssetId>, XcmPaymentApiError> {
-			let acceptable_assets = vec![AssetId(xcm_config::WestendLocation::get())];
+			let native_token = xcm_config::WestendLocation::get();
+			// We accept the native token to pay fees.
+			let mut acceptable_assets = vec![AssetId(native_token.clone())];
+			// We also accept all assets in a pool with the native token.
+			acceptable_assets.extend(
+				pallet_asset_conversion::Pools::<Runtime>::iter_keys().filter_map(
+					|(asset_1, asset_2)| {
+						if asset_1 == native_token {
+							Some(asset_2.clone().into())
+						} else if asset_2 == native_token {
+							Some(asset_1.clone().into())
+						} else {
+							None
+						}
+					},
+				),
+			);
 			PolkadotXcm::query_acceptable_payment_assets(xcm_version, acceptable_assets)
 		}
 
diff --git a/prdoc/pr_6069.prdoc b/prdoc/pr_6069.prdoc
new file mode 100644
index 00000000000..990d2bb4e18
--- /dev/null
+++ b/prdoc/pr_6069.prdoc
@@ -0,0 +1,19 @@
+# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0
+# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json
+
+title: Add assets in pool with native to query_acceptable_payment_assets
+
+doc:
+  - audience: Runtime Dev
+    description: |
+      The `XcmPaymentApi::query_acceptable_payment_assets` API can be used to get a list of all
+      the assets that can be used for fee payment.
+      This is usually just the native asset, but the asset hubs have the asset conversion pallet.
+      In the case of the asset hubs, this list now includes all assets in a liquidity pool with
+      the native one.
+
+crates:
+  - name: asset-hub-rococo-runtime
+    bump: minor
+  - name: asset-hub-westend-runtime
+    bump: minor
-- 
GitLab