From b74e584e028829a033115ac2802c44b6fc7576f2 Mon Sep 17 00:00:00 2001
From: girazoki <gorka.irazoki@gmail.com>
Date: Tue, 13 Sep 2022 02:12:09 +0200
Subject: [PATCH] Add inspect trait for asset roles (#11738)

Co-authored-by: Shawn Tabrizi <shawntabrizi@gmail.com>
---
 substrate/frame/assets/src/impl_fungibles.rs  | 20 +++++++++++++
 substrate/frame/assets/src/tests.rs           | 22 ++++++++++++++
 .../support/src/traits/tokens/fungibles.rs    |  1 +
 .../src/traits/tokens/fungibles/roles.rs      | 29 +++++++++++++++++++
 4 files changed, 72 insertions(+)
 create mode 100644 substrate/frame/support/src/traits/tokens/fungibles/roles.rs

diff --git a/substrate/frame/assets/src/impl_fungibles.rs b/substrate/frame/assets/src/impl_fungibles.rs
index 6b263bc0c7b..842ee5c102c 100644
--- a/substrate/frame/assets/src/impl_fungibles.rs
+++ b/substrate/frame/assets/src/impl_fungibles.rs
@@ -263,3 +263,23 @@ impl<T: Config<I>, I: 'static> fungibles::approvals::Mutate<<T as SystemConfig>:
 		Self::do_transfer_approved(asset, owner, delegate, dest, amount)
 	}
 }
+
+impl<T: Config<I>, I: 'static> fungibles::roles::Inspect<<T as SystemConfig>::AccountId>
+	for Pallet<T, I>
+{
+	fn owner(asset: T::AssetId) -> Option<<T as SystemConfig>::AccountId> {
+		Asset::<T, I>::get(asset).map(|x| x.owner)
+	}
+
+	fn issuer(asset: T::AssetId) -> Option<<T as SystemConfig>::AccountId> {
+		Asset::<T, I>::get(asset).map(|x| x.issuer)
+	}
+
+	fn admin(asset: T::AssetId) -> Option<<T as SystemConfig>::AccountId> {
+		Asset::<T, I>::get(asset).map(|x| x.admin)
+	}
+
+	fn freezer(asset: T::AssetId) -> Option<<T as SystemConfig>::AccountId> {
+		Asset::<T, I>::get(asset).map(|x| x.freezer)
+	}
+}
diff --git a/substrate/frame/assets/src/tests.rs b/substrate/frame/assets/src/tests.rs
index 50ab04111ed..598b6049b3d 100644
--- a/substrate/frame/assets/src/tests.rs
+++ b/substrate/frame/assets/src/tests.rs
@@ -977,3 +977,25 @@ fn transfer_large_asset() {
 		assert_ok!(Assets::transfer(Origin::signed(1), 0, 2, amount - 1));
 	})
 }
+
+#[test]
+fn querying_roles_should_work() {
+	new_test_ext().execute_with(|| {
+		use frame_support::traits::tokens::fungibles::roles::Inspect;
+		assert_ok!(Assets::force_create(Origin::root(), 0, 1, true, 1));
+		assert_ok!(Assets::set_team(
+			Origin::signed(1),
+			0,
+			// Issuer
+			2,
+			// Admin
+			3,
+			// Freezer
+			4,
+		));
+		assert_eq!(Assets::owner(0), Some(1));
+		assert_eq!(Assets::issuer(0), Some(2));
+		assert_eq!(Assets::admin(0), Some(3));
+		assert_eq!(Assets::freezer(0), Some(4));
+	});
+}
diff --git a/substrate/frame/support/src/traits/tokens/fungibles.rs b/substrate/frame/support/src/traits/tokens/fungibles.rs
index dab50d56962..e4108b7f80a 100644
--- a/substrate/frame/support/src/traits/tokens/fungibles.rs
+++ b/substrate/frame/support/src/traits/tokens/fungibles.rs
@@ -31,6 +31,7 @@ pub mod metadata;
 pub use balanced::{Balanced, Unbalanced};
 mod imbalance;
 pub use imbalance::{CreditOf, DebtOf, HandleImbalanceDrop, Imbalance};
+pub mod roles;
 
 /// Trait for providing balance-inspection access to a set of named fungible assets.
 pub trait Inspect<AccountId> {
diff --git a/substrate/frame/support/src/traits/tokens/fungibles/roles.rs b/substrate/frame/support/src/traits/tokens/fungibles/roles.rs
new file mode 100644
index 00000000000..18fd1cc8012
--- /dev/null
+++ b/substrate/frame/support/src/traits/tokens/fungibles/roles.rs
@@ -0,0 +1,29 @@
+// This file is part of Substrate.
+
+// Copyright (C) 2019-2022 Parity Technologies (UK) Ltd.
+// SPDX-License-Identifier: Apache-2.0
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// 	http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Inspect traits for Asset roles
+
+pub trait Inspect<AccountId>: super::Inspect<AccountId> {
+	// Get owner for an AssetId.
+	fn owner(asset: Self::AssetId) -> Option<AccountId>;
+	// Get issuer for an AssetId.
+	fn issuer(asset: Self::AssetId) -> Option<AccountId>;
+	// Get admin for an AssetId.
+	fn admin(asset: Self::AssetId) -> Option<AccountId>;
+	// Get freezer for an AssetId.
+	fn freezer(asset: Self::AssetId) -> Option<AccountId>;
+}
-- 
GitLab