From 1dc935c715ac715ac8f8fce2907ef8b2af2c8c38 Mon Sep 17 00:00:00 2001
From: Ignacio Palacios <ignacio.palacios.santos@gmail.com>
Date: Mon, 9 Oct 2023 12:15:30 +0200
Subject: [PATCH] [xcm-emulator] Decouple the `AccountId` type from
 `AccountId32` (#1458)

Closes: #1381

Originally from: https://github.com/paritytech/cumulus/pull/3037

---------

Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com>
---
 cumulus/xcm/xcm-emulator/src/lib.rs | 57 +++++++++++++++--------------
 1 file changed, 30 insertions(+), 27 deletions(-)

diff --git a/cumulus/xcm/xcm-emulator/src/lib.rs b/cumulus/xcm/xcm-emulator/src/lib.rs
index 9fda0632bae..caf73ae1e41 100644
--- a/cumulus/xcm/xcm-emulator/src/lib.rs
+++ b/cumulus/xcm/xcm-emulator/src/lib.rs
@@ -26,7 +26,7 @@ pub use std::{
 // Substrate
 pub use frame_support::{
 	assert_ok,
-	sp_runtime::{traits::Header as HeaderT, AccountId32, DispatchResult},
+	sp_runtime::{traits::Header as HeaderT, DispatchResult},
 	traits::{
 		EnqueueMessage, Get, Hooks, OriginTrait, ProcessMessage, ProcessMessageError, ServiceQueues,
 	},
@@ -61,6 +61,8 @@ pub use xcm::v3::prelude::{
 };
 pub use xcm_executor::traits::ConvertLocation;
 
+pub type AccountIdOf<T> = <T as frame_system::Config>::AccountId;
+
 thread_local! {
 	/// Downward messages, each message is: `(to_para_id, [(relay_block_number, msg)])`
 	#[allow(clippy::type_complexity)]
@@ -90,8 +92,8 @@ pub trait CheckAssertion<Origin, Destination, Hops, Args>
 where
 	Origin: Chain + Clone,
 	Destination: Chain + Clone,
-	Origin::RuntimeOrigin: OriginTrait<AccountId = AccountId32> + Clone,
-	Destination::RuntimeOrigin: OriginTrait<AccountId = AccountId32> + Clone,
+	Origin::RuntimeOrigin: OriginTrait<AccountId = AccountIdOf<Origin::Runtime>> + Clone,
+	Destination::RuntimeOrigin: OriginTrait<AccountId = AccountIdOf<Destination::Runtime>> + Clone,
 	Hops: Clone,
 	Args: Clone,
 {
@@ -103,8 +105,8 @@ impl<Origin, Destination, Hops, Args> CheckAssertion<Origin, Destination, Hops,
 where
 	Origin: Chain + Clone,
 	Destination: Chain + Clone,
-	Origin::RuntimeOrigin: OriginTrait<AccountId = AccountId32> + Clone,
-	Destination::RuntimeOrigin: OriginTrait<AccountId = AccountId32> + Clone,
+	Origin::RuntimeOrigin: OriginTrait<AccountId = AccountIdOf<Origin::Runtime>> + Clone,
+	Destination::RuntimeOrigin: OriginTrait<AccountId = AccountIdOf<Destination::Runtime>> + Clone,
 	Hops: Clone,
 	Args: Clone,
 {
@@ -219,24 +221,24 @@ pub trait Chain: TestExt + NetworkComponent {
 		helpers::get_account_id_from_seed::<sr25519::Public>(seed)
 	}
 
-	fn account_data_of(account: AccountId) -> AccountData<Balance>;
+	fn account_data_of(account: AccountIdOf<Self::Runtime>) -> AccountData<Balance>;
 
 	fn events() -> Vec<<Self as Chain>::RuntimeEvent>;
 }
 
 pub trait RelayChain: Chain {
 	type MessageProcessor: ProcessMessage;
-	type SovereignAccountOf: ConvertLocation<AccountId>;
+	type SovereignAccountOf: ConvertLocation<AccountIdOf<Self::Runtime>>;
 
 	fn child_location_of(id: ParaId) -> MultiLocation {
 		(Ancestor(0), ParachainJunction(id.into())).into()
 	}
 
-	fn sovereign_account_id_of(location: MultiLocation) -> AccountId {
+	fn sovereign_account_id_of(location: MultiLocation) -> AccountIdOf<Self::Runtime> {
 		Self::SovereignAccountOf::convert_location(&location).unwrap()
 	}
 
-	fn sovereign_account_id_of_child_para(id: ParaId) -> AccountId {
+	fn sovereign_account_id_of_child_para(id: ParaId) -> AccountIdOf<Self::Runtime> {
 		Self::sovereign_account_id_of(Self::child_location_of(id))
 	}
 }
@@ -244,7 +246,7 @@ pub trait RelayChain: Chain {
 pub trait Parachain: Chain {
 	type XcmpMessageHandler: XcmpMessageHandler;
 	type DmpMessageHandler: DmpMessageHandler;
-	type LocationToAccountId: ConvertLocation<AccountId>;
+	type LocationToAccountId: ConvertLocation<AccountIdOf<Self::Runtime>>;
 	type ParachainInfo: Get<ParaId>;
 	type ParachainSystem;
 
@@ -268,7 +270,7 @@ pub trait Parachain: Chain {
 		(Parent, X1(ParachainJunction(para_id.into()))).into()
 	}
 
-	fn sovereign_account_id_of(location: MultiLocation) -> AccountId {
+	fn sovereign_account_id_of(location: MultiLocation) -> AccountIdOf<Self::Runtime> {
 		Self::LocationToAccountId::convert_location(&location).unwrap()
 	}
 }
@@ -365,7 +367,7 @@ macro_rules! decl_test_relay_chains {
 				type RuntimeEvent = $runtime::RuntimeEvent;
 				type System = $crate::SystemPallet::<Self::Runtime>;
 
-				fn account_data_of(account: $crate::AccountId) -> $crate::AccountData<$crate::Balance> {
+				fn account_data_of(account: $crate::AccountIdOf<Self::Runtime>) -> $crate::AccountData<$crate::Balance> {
 					<Self as $crate::TestExt>::ext_wrapper(|| $crate::SystemPallet::<Self::Runtime>::account(account).data.into())
 				}
 
@@ -590,7 +592,7 @@ macro_rules! decl_test_parachains {
 				type RuntimeEvent = $runtime::RuntimeEvent;
 				type System = $crate::SystemPallet::<Self::Runtime>;
 
-				fn account_data_of(account: $crate::AccountId) -> $crate::AccountData<$crate::Balance> {
+				fn account_data_of(account: $crate::AccountIdOf<Self::Runtime>) -> $crate::AccountData<$crate::Balance> {
 					<Self as $crate::TestExt>::ext_wrapper(|| $crate::SystemPallet::<Self::Runtime>::account(account).data.into())
 				}
 
@@ -1159,9 +1161,10 @@ macro_rules! __impl_check_assertion {
 		where
 			Origin: $crate::Chain + Clone,
 			Destination: $crate::Chain + Clone,
-			Origin::RuntimeOrigin: $crate::OriginTrait<AccountId = $crate::AccountId32> + Clone,
+			Origin::RuntimeOrigin:
+				$crate::OriginTrait<AccountId = $crate::AccountIdOf<Origin::Runtime>> + Clone,
 			Destination::RuntimeOrigin:
-				$crate::OriginTrait<AccountId = $crate::AccountId32> + Clone,
+				$crate::OriginTrait<AccountId = $crate::AccountIdOf<Destination::Runtime>> + Clone,
 			Hops: Clone,
 			Args: Clone,
 		{
@@ -1308,8 +1311,8 @@ where
 
 /// Struct that keeps account's id and balance
 #[derive(Clone)]
-pub struct TestAccount {
-	pub account_id: AccountId,
+pub struct TestAccount<R: Chain> {
+	pub account_id: AccountIdOf<R::Runtime>,
 	pub balance: Balance,
 }
 
@@ -1326,9 +1329,9 @@ pub struct TestArgs {
 }
 
 /// Auxiliar struct to help creating a new `Test` instance
-pub struct TestContext<T> {
-	pub sender: AccountId,
-	pub receiver: AccountId,
+pub struct TestContext<T, Origin: Chain, Destination: Chain> {
+	pub sender: AccountIdOf<Origin::Runtime>,
+	pub receiver: AccountIdOf<Destination::Runtime>,
 	pub args: T,
 }
 
@@ -1345,12 +1348,12 @@ pub struct Test<Origin, Destination, Hops = (), Args = TestArgs>
 where
 	Origin: Chain + Clone,
 	Destination: Chain + Clone,
-	Origin::RuntimeOrigin: OriginTrait<AccountId = AccountId32> + Clone,
-	Destination::RuntimeOrigin: OriginTrait<AccountId = AccountId32> + Clone,
+	Origin::RuntimeOrigin: OriginTrait<AccountId = AccountIdOf<Origin::Runtime>> + Clone,
+	Destination::RuntimeOrigin: OriginTrait<AccountId = AccountIdOf<Destination::Runtime>> + Clone,
 	Hops: Clone,
 {
-	pub sender: TestAccount,
-	pub receiver: TestAccount,
+	pub sender: TestAccount<Origin>,
+	pub receiver: TestAccount<Destination>,
 	pub signed_origin: Origin::RuntimeOrigin,
 	pub root_origin: Origin::RuntimeOrigin,
 	pub hops_assertion: HashMap<String, fn(Self)>,
@@ -1365,12 +1368,12 @@ where
 	Args: Clone,
 	Origin: Chain + Clone + CheckAssertion<Origin, Destination, Hops, Args>,
 	Destination: Chain + Clone + CheckAssertion<Origin, Destination, Hops, Args>,
-	Origin::RuntimeOrigin: OriginTrait<AccountId = AccountId32> + Clone,
-	Destination::RuntimeOrigin: OriginTrait<AccountId = AccountId32> + Clone,
+	Origin::RuntimeOrigin: OriginTrait<AccountId = AccountIdOf<Origin::Runtime>> + Clone,
+	Destination::RuntimeOrigin: OriginTrait<AccountId = AccountIdOf<Destination::Runtime>> + Clone,
 	Hops: Clone + CheckAssertion<Origin, Destination, Hops, Args>,
 {
 	/// Creates a new `Test` instance
-	pub fn new(test_args: TestContext<Args>) -> Self {
+	pub fn new(test_args: TestContext<Args, Origin, Destination>) -> Self {
 		Test {
 			sender: TestAccount {
 				account_id: test_args.sender.clone(),
-- 
GitLab