From ae2905df87e188c58db07e7b6be73b25dbb955b3 Mon Sep 17 00:00:00 2001
From: Branislav Kontur <bkontur@gmail.com>
Date: Mon, 17 Apr 2023 17:01:40 +0200
Subject: [PATCH] Changed `query_account_balances` return type (#2455)

---
 .../runtimes/assets/common/src/runtime_api.rs   |  5 +++++
 .../runtimes/assets/statemine/src/lib.rs        |  4 ++--
 .../runtimes/assets/statemine/tests/tests.rs    | 17 ++++++++++++-----
 .../runtimes/assets/statemint/src/lib.rs        |  4 ++--
 .../runtimes/assets/statemint/tests/tests.rs    | 15 +++++++++++----
 .../runtimes/assets/westmint/src/lib.rs         |  4 ++--
 .../runtimes/assets/westmint/tests/tests.rs     | 17 ++++++++++++-----
 7 files changed, 46 insertions(+), 20 deletions(-)

diff --git a/cumulus/parachains/runtimes/assets/common/src/runtime_api.rs b/cumulus/parachains/runtimes/assets/common/src/runtime_api.rs
index 36a8df1271e..ceb8bc13fcc 100644
--- a/cumulus/parachains/runtimes/assets/common/src/runtime_api.rs
+++ b/cumulus/parachains/runtimes/assets/common/src/runtime_api.rs
@@ -31,11 +31,16 @@ pub enum FungiblesAccessError {
 
 sp_api::decl_runtime_apis! {
 	/// The API for querying account's balances from runtime.
+	#[api_version(2)]
 	pub trait FungiblesApi<AccountId>
 	where
 		AccountId: Codec,
 	{
 		/// Returns the list of all [`MultiAsset`] that an `AccountId` has.
+		#[changed_in(2)]
 		fn query_account_balances(account: AccountId) -> Result<Vec<MultiAsset>, FungiblesAccessError>;
+
+		/// Returns the list of all [`MultiAsset`] that an `AccountId` has.
+		fn query_account_balances(account: AccountId) -> Result<xcm::VersionedMultiAssets, FungiblesAccessError>;
 	}
 }
diff --git a/cumulus/parachains/runtimes/assets/statemine/src/lib.rs b/cumulus/parachains/runtimes/assets/statemine/src/lib.rs
index 62425aa7496..5f987851a18 100644
--- a/cumulus/parachains/runtimes/assets/statemine/src/lib.rs
+++ b/cumulus/parachains/runtimes/assets/statemine/src/lib.rs
@@ -951,7 +951,7 @@ impl_runtime_apis! {
 		AccountId,
 	> for Runtime
 	{
-		fn query_account_balances(account: AccountId) -> Result<Vec<xcm::latest::MultiAsset>, assets_common::runtime_api::FungiblesAccessError> {
+		fn query_account_balances(account: AccountId) -> Result<xcm::VersionedMultiAssets, assets_common::runtime_api::FungiblesAccessError> {
 			use assets_common::fungible_conversion::{convert, convert_balance};
 			Ok([
 				// collect pallet_balance
@@ -976,7 +976,7 @@ impl_runtime_apis! {
 						.filter(|(_, balance)| balance > &0)
 				)?,
 				// collect ... e.g. other tokens
-			].concat())
+			].concat().into())
 		}
 	}
 
diff --git a/cumulus/parachains/runtimes/assets/statemine/tests/tests.rs b/cumulus/parachains/runtimes/assets/statemine/tests/tests.rs
index 972abe9d427..acfb2417e4b 100644
--- a/cumulus/parachains/runtimes/assets/statemine/tests/tests.rs
+++ b/cumulus/parachains/runtimes/assets/statemine/tests/tests.rs
@@ -383,7 +383,11 @@ fn test_assets_balances_api_works() {
 				0
 			);
 			assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 0);
-			assert!(Runtime::query_account_balances(AccountId::from(ALICE)).unwrap().is_empty());
+			assert!(Runtime::query_account_balances(AccountId::from(ALICE))
+				.unwrap()
+				.try_as::<MultiAssets>()
+				.unwrap()
+				.is_none());
 
 			// Drip some balance
 			use frame_support::traits::fungible::Mutate;
@@ -437,24 +441,27 @@ fn test_assets_balances_api_works() {
 			);
 			assert_eq!(Balances::free_balance(AccountId::from(ALICE)), some_currency);
 
-			let result = Runtime::query_account_balances(AccountId::from(ALICE)).unwrap();
+			let result: MultiAssets = Runtime::query_account_balances(AccountId::from(ALICE))
+				.unwrap()
+				.try_into()
+				.unwrap();
 			assert_eq!(result.len(), 3);
 
 			// check currency
-			assert!(result.iter().any(|asset| asset.eq(
+			assert!(result.inner().iter().any(|asset| asset.eq(
 				&assets_common::fungible_conversion::convert_balance::<KsmLocation, Balance>(
 					some_currency
 				)
 				.unwrap()
 			)));
 			// check trusted asset
-			assert!(result.iter().any(|asset| asset.eq(&(
+			assert!(result.inner().iter().any(|asset| asset.eq(&(
 				AssetIdForTrustBackedAssetsConvert::reverse_ref(local_asset_id).unwrap(),
 				minimum_asset_balance
 			)
 				.into())));
 			// check foreign asset
-			assert!(result.iter().any(|asset| asset.eq(&(
+			assert!(result.inner().iter().any(|asset| asset.eq(&(
 				Identity::reverse_ref(foreign_asset_id_multilocation).unwrap(),
 				6 * foreign_asset_minimum_asset_balance
 			)
diff --git a/cumulus/parachains/runtimes/assets/statemint/src/lib.rs b/cumulus/parachains/runtimes/assets/statemint/src/lib.rs
index a72df7314e6..aa90ca7a157 100644
--- a/cumulus/parachains/runtimes/assets/statemint/src/lib.rs
+++ b/cumulus/parachains/runtimes/assets/statemint/src/lib.rs
@@ -855,7 +855,7 @@ impl_runtime_apis! {
 		AccountId,
 	> for Runtime
 	{
-		fn query_account_balances(account: AccountId) -> Result<Vec<xcm::latest::MultiAsset>, assets_common::runtime_api::FungiblesAccessError> {
+		fn query_account_balances(account: AccountId) -> Result<xcm::VersionedMultiAssets, assets_common::runtime_api::FungiblesAccessError> {
 			use assets_common::fungible_conversion::{convert, convert_balance};
 			Ok([
 				// collect pallet_balance
@@ -874,7 +874,7 @@ impl_runtime_apis! {
 						.filter(|(_, balance)| balance > &0)
 				)?,
 				// collect ... e.g. pallet_assets ForeignAssets
-			].concat())
+			].concat().into())
 		}
 	}
 
diff --git a/cumulus/parachains/runtimes/assets/statemint/tests/tests.rs b/cumulus/parachains/runtimes/assets/statemint/tests/tests.rs
index 501c16960aa..75f6aaf6d57 100644
--- a/cumulus/parachains/runtimes/assets/statemint/tests/tests.rs
+++ b/cumulus/parachains/runtimes/assets/statemint/tests/tests.rs
@@ -389,7 +389,11 @@ fn test_assets_balances_api_works() {
 			// check before
 			assert_eq!(Assets::balance(local_asset_id, AccountId::from(ALICE)), 0);
 			assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 0);
-			assert!(Runtime::query_account_balances(AccountId::from(ALICE)).unwrap().is_empty());
+			assert!(Runtime::query_account_balances(AccountId::from(ALICE))
+				.unwrap()
+				.try_as::<MultiAssets>()
+				.unwrap()
+				.is_none());
 
 			// Drip some balance
 			use frame_support::traits::fungible::Mutate;
@@ -421,18 +425,21 @@ fn test_assets_balances_api_works() {
 			);
 			assert_eq!(Balances::free_balance(AccountId::from(ALICE)), some_currency);
 
-			let result = Runtime::query_account_balances(AccountId::from(ALICE)).unwrap();
+			let result: MultiAssets = Runtime::query_account_balances(AccountId::from(ALICE))
+				.unwrap()
+				.try_into()
+				.unwrap();
 			assert_eq!(result.len(), 2);
 
 			// check currency
-			assert!(result.iter().any(|asset| asset.eq(
+			assert!(result.inner().iter().any(|asset| asset.eq(
 				&assets_common::fungible_conversion::convert_balance::<DotLocation, Balance>(
 					some_currency
 				)
 				.unwrap()
 			)));
 			// check trusted asset
-			assert!(result.iter().any(|asset| asset.eq(&(
+			assert!(result.inner().iter().any(|asset| asset.eq(&(
 				AssetIdForTrustBackedAssetsConvert::reverse_ref(local_asset_id).unwrap(),
 				minimum_asset_balance
 			)
diff --git a/cumulus/parachains/runtimes/assets/westmint/src/lib.rs b/cumulus/parachains/runtimes/assets/westmint/src/lib.rs
index 97d2596a4bd..c237c8dc5cf 100644
--- a/cumulus/parachains/runtimes/assets/westmint/src/lib.rs
+++ b/cumulus/parachains/runtimes/assets/westmint/src/lib.rs
@@ -963,7 +963,7 @@ impl_runtime_apis! {
 		AccountId,
 	> for Runtime
 	{
-		fn query_account_balances(account: AccountId) -> Result<Vec<xcm::latest::MultiAsset>, assets_common::runtime_api::FungiblesAccessError> {
+		fn query_account_balances(account: AccountId) -> Result<xcm::VersionedMultiAssets, assets_common::runtime_api::FungiblesAccessError> {
 			use assets_common::fungible_conversion::{convert, convert_balance};
 			Ok([
 				// collect pallet_balance
@@ -988,7 +988,7 @@ impl_runtime_apis! {
 						.filter(|(_, balance)| balance > &0)
 				)?,
 				// collect ... e.g. other tokens
-			].concat())
+			].concat().into())
 		}
 	}
 
diff --git a/cumulus/parachains/runtimes/assets/westmint/tests/tests.rs b/cumulus/parachains/runtimes/assets/westmint/tests/tests.rs
index e04c163b01f..c0c20c6b61a 100644
--- a/cumulus/parachains/runtimes/assets/westmint/tests/tests.rs
+++ b/cumulus/parachains/runtimes/assets/westmint/tests/tests.rs
@@ -388,7 +388,11 @@ fn test_assets_balances_api_works() {
 				0
 			);
 			assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 0);
-			assert!(Runtime::query_account_balances(AccountId::from(ALICE)).unwrap().is_empty());
+			assert!(Runtime::query_account_balances(AccountId::from(ALICE))
+				.unwrap()
+				.try_as::<MultiAssets>()
+				.unwrap()
+				.is_none());
 
 			// Drip some balance
 			use frame_support::traits::fungible::Mutate;
@@ -442,24 +446,27 @@ fn test_assets_balances_api_works() {
 			);
 			assert_eq!(Balances::free_balance(AccountId::from(ALICE)), some_currency);
 
-			let result = Runtime::query_account_balances(AccountId::from(ALICE)).unwrap();
+			let result: MultiAssets = Runtime::query_account_balances(AccountId::from(ALICE))
+				.unwrap()
+				.try_into()
+				.unwrap();
 			assert_eq!(result.len(), 3);
 
 			// check currency
-			assert!(result.iter().any(|asset| asset.eq(
+			assert!(result.inner().iter().any(|asset| asset.eq(
 				&assets_common::fungible_conversion::convert_balance::<WestendLocation, Balance>(
 					some_currency
 				)
 				.unwrap()
 			)));
 			// check trusted asset
-			assert!(result.iter().any(|asset| asset.eq(&(
+			assert!(result.inner().iter().any(|asset| asset.eq(&(
 				AssetIdForTrustBackedAssetsConvert::reverse_ref(local_asset_id).unwrap(),
 				minimum_asset_balance
 			)
 				.into())));
 			// check foreign asset
-			assert!(result.iter().any(|asset| asset.eq(&(
+			assert!(result.inner().iter().any(|asset| asset.eq(&(
 				Identity::reverse_ref(foreign_asset_id_multilocation).unwrap(),
 				6 * foreign_asset_minimum_asset_balance
 			)
-- 
GitLab