From f49074443d4242bbed268e2d252cfb9e41444bad Mon Sep 17 00:00:00 2001
From: muharem <ismailov.m.h@gmail.com>
Date: Wed, 25 Oct 2023 16:26:08 +0200
Subject: [PATCH] asset conversion tx payment

---
 .../asset-conversion-tx-payment/src/lib.rs    |  1 -
 .../asset-conversion-tx-payment/src/mock.rs   | 43 ++++++++++---------
 .../src/payment.rs                            | 17 ++++----
 .../asset-conversion-tx-payment/src/tests.rs  | 43 +++++++++----------
 4 files changed, 53 insertions(+), 51 deletions(-)

diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/lib.rs b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/lib.rs
index 04a71e2ff42..ed0ed56e6e0 100644
--- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/lib.rs
+++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/lib.rs
@@ -69,7 +69,6 @@ mod tests;
 
 mod payment;
 use frame_support::traits::tokens::AssetId;
-use pallet_asset_conversion::MultiAssetIdConverter;
 pub use payment::*;
 
 /// Type aliases used for interaction with `OnChargeTransaction`.
diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs
index 2a18b620ede..373ecef27ef 100644
--- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs
+++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs
@@ -16,20 +16,25 @@
 use super::*;
 use crate as pallet_asset_conversion_tx_payment;
 
-use codec;
 use frame_support::{
 	dispatch::DispatchClass,
 	instances::Instance2,
 	ord_parameter_types,
 	pallet_prelude::*,
 	parameter_types,
-	traits::{AsEnsureOriginWithArg, ConstU32, ConstU64, ConstU8, Imbalance, OnUnbalanced},
+	traits::{
+		tokens::{
+			fungible::{NativeFromLeft, NativeOrWithId, UnionOf},
+			imbalance::ResolveAssetTo,
+		},
+		AsEnsureOriginWithArg, ConstU32, ConstU64, ConstU8, Imbalance, OnUnbalanced,
+	},
 	weights::{Weight, WeightToFee as WeightToFeeT},
 	PalletId,
 };
 use frame_system as system;
 use frame_system::{EnsureRoot, EnsureSignedBy};
-use pallet_asset_conversion::{NativeOrAssetId, NativeOrAssetIdConverter};
+use pallet_asset_conversion::{Ascending, Chain, WithFirstAsset};
 use pallet_transaction_payment::CurrencyAdapter;
 use sp_core::H256;
 use sp_runtime::{
@@ -223,10 +228,9 @@ impl pallet_assets::Config<Instance2> for Runtime {
 
 parameter_types! {
 	pub const AssetConversionPalletId: PalletId = PalletId(*b"py/ascon");
-	pub storage AllowMultiAssetPools: bool = false;
-	// should be non-zero if AllowMultiAssetPools is true, otherwise can be zero
 	pub storage LiquidityWithdrawalFee: Permill = Permill::from_percent(0);
 	pub const MaxSwapPathLength: u32 = 4;
+	pub const Native: NativeOrWithId<u32> = NativeOrWithId::Native;
 }
 
 ord_parameter_types! {
@@ -235,27 +239,26 @@ ord_parameter_types! {
 
 impl pallet_asset_conversion::Config for Runtime {
 	type RuntimeEvent = RuntimeEvent;
-	type Currency = Balances;
-	type AssetId = u32;
+	type Balance = Balance;
+	type HigherPrecisionBalance = u128;
+	type AssetKind = NativeOrWithId<u32>;
+	type Assets = UnionOf<Balances, Assets, NativeFromLeft, NativeOrWithId<u32>, AccountId>;
+	type PoolId = (Self::AssetKind, Self::AssetKind);
+	type PoolLocator = Chain<
+		WithFirstAsset<Native, AccountId, NativeOrWithId<u32>>,
+		Ascending<AccountId, NativeOrWithId<u32>>,
+	>;
 	type PoolAssetId = u32;
-	type Assets = Assets;
 	type PoolAssets = PoolAssets;
+	type PoolSetupFee = ConstU64<100>; // should be more or equal to the existential deposit
+	type PoolSetupFeeAsset = Native;
+	type PoolSetupFeeTarget = ResolveAssetTo<AssetConversionOrigin, Self::Assets>;
 	type PalletId = AssetConversionPalletId;
-	type WeightInfo = ();
 	type LPFee = ConstU32<3>; // means 0.3%
-	type PoolSetupFee = ConstU64<100>; // should be more or equal to the existential deposit
-	type PoolSetupFeeReceiver = AssetConversionOrigin;
 	type LiquidityWithdrawalFee = LiquidityWithdrawalFee;
-	type AllowMultiAssetPools = AllowMultiAssetPools;
 	type MaxSwapPathLength = MaxSwapPathLength;
 	type MintMinLiquidity = ConstU64<100>; // 100 is good enough when the main currency has 12 decimals.
-
-	type Balance = u64;
-	type HigherPrecisionBalance = u128;
-
-	type MultiAssetId = NativeOrAssetId<u32>;
-	type MultiAssetIdConverter = NativeOrAssetIdConverter<u32>;
-
+	type WeightInfo = ();
 	pallet_asset_conversion::runtime_benchmarks_enabled! {
 		type BenchmarkHelper = ();
 	}
@@ -264,5 +267,5 @@ impl pallet_asset_conversion::Config for Runtime {
 impl Config for Runtime {
 	type RuntimeEvent = RuntimeEvent;
 	type Fungibles = Assets;
-	type OnChargeAssetTransaction = AssetConversionAdapter<Balances, AssetConversion>;
+	type OnChargeAssetTransaction = AssetConversionAdapter<Balances, AssetConversion, Native>;
 }
diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/payment.rs b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/payment.rs
index ccea9e55bbe..f2f2c57bb37 100644
--- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/payment.rs
+++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/payment.rs
@@ -24,7 +24,7 @@ use frame_support::{
 };
 use pallet_asset_conversion::Swap;
 use sp_runtime::{
-	traits::{DispatchInfoOf, PostDispatchInfoOf, Zero},
+	traits::{DispatchInfoOf, Get, PostDispatchInfoOf, Zero},
 	transaction_validity::InvalidTransaction,
 	Saturating,
 };
@@ -76,16 +76,17 @@ pub trait OnChargeAssetTransaction<T: Config> {
 /// Implements the asset transaction for a balance to asset converter (implementing [`Swap`]).
 ///
 /// The converter is given the complete fee in terms of the asset used for the transaction.
-pub struct AssetConversionAdapter<C, CON>(PhantomData<(C, CON)>);
+pub struct AssetConversionAdapter<C, CON, N>(PhantomData<(C, CON, N)>);
 
 /// Default implementation for a runtime instantiating this pallet, an asset to native swapper.
-impl<T, C, CON> OnChargeAssetTransaction<T> for AssetConversionAdapter<C, CON>
+impl<T, C, CON, N> OnChargeAssetTransaction<T> for AssetConversionAdapter<C, CON, N>
 where
+	N: Get<CON::AssetKind>,
 	T: Config,
 	C: Inspect<<T as frame_system::Config>::AccountId>,
-	CON: Swap<T::AccountId, Balance = BalanceOf<T>, MultiAssetId = T::MultiAssetId>,
+	CON: Swap<T::AccountId, Balance = BalanceOf<T>, AssetKind = T::AssetKind>,
 	BalanceOf<T>: Into<AssetBalanceOf<T>>,
-	T::MultiAssetId: From<AssetIdOf<T>>,
+	T::AssetKind: From<AssetIdOf<T>>,
 	BalanceOf<T>: IsType<<C as Inspect<<T as frame_system::Config>::AccountId>>::Balance>,
 {
 	type Balance = BalanceOf<T>;
@@ -116,7 +117,7 @@ where
 
 		let asset_consumed = CON::swap_tokens_for_exact_tokens(
 			who.clone(),
-			vec![asset_id.into(), T::MultiAssetIdConverter::get_native()],
+			vec![asset_id.into(), N::get()],
 			native_asset_required,
 			None,
 			who.clone(),
@@ -168,8 +169,8 @@ where
 			match CON::swap_exact_tokens_for_tokens(
 				who.clone(), // we already deposited the native to `who`
 				vec![
-					T::MultiAssetIdConverter::get_native(), // we provide the native
-					asset_id.into(),                        // we want asset_id back
+					N::get(),        // we provide the native
+					asset_id.into(), // we want asset_id back
 				],
 				swap_back,   // amount of the native asset to convert to `asset_id`
 				None,        // no minimum amount back
diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs
index d50a0516423..62faed269d3 100644
--- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs
+++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs
@@ -20,14 +20,13 @@ use frame_support::{
 	dispatch::{DispatchInfo, PostDispatchInfo},
 	pallet_prelude::*,
 	traits::{
-		fungible::Inspect,
+		fungible::{Inspect, NativeOrWithId},
 		fungibles::{Inspect as FungiblesInspect, Mutate},
 	},
 	weights::Weight,
 };
 use frame_system as system;
 use mock::{ExtrinsicBaseWeight, *};
-use pallet_asset_conversion::NativeOrAssetId;
 use pallet_balances::Call as BalancesCall;
 use sp_runtime::{traits::StaticLookup, BuildStorage};
 
@@ -127,12 +126,12 @@ fn setup_lp(asset_id: u32, balance_factor: u64) {
 		10_000 * balance_factor + ed_asset
 	));
 
-	let token_1 = NativeOrAssetId::Native;
-	let token_2 = NativeOrAssetId::Asset(asset_id);
+	let token_1 = NativeOrWithId::Native;
+	let token_2 = NativeOrWithId::WithId(asset_id);
 	assert_ok!(AssetConversion::create_pool(
 		RuntimeOrigin::signed(lp_provider),
-		Box::new(token_1),
-		Box::new(token_2)
+		Box::new(token_1.clone()),
+		Box::new(token_2.clone())
 	));
 
 	assert_ok!(AssetConversion::add_liquidity(
@@ -228,8 +227,8 @@ fn transaction_payment_in_asset_possible() {
 
 			let fee_in_native = base_weight + tx_weight + len as u64;
 			let input_quote = AssetConversion::quote_price_tokens_for_exact_tokens(
-				NativeOrAssetId::Asset(asset_id),
-				NativeOrAssetId::Native,
+				NativeOrWithId::WithId(asset_id),
+				NativeOrWithId::Native,
 				fee_in_native,
 				true,
 			);
@@ -337,8 +336,8 @@ fn transaction_payment_without_fee() {
 			let len = 10;
 			let fee_in_native = base_weight + weight + len as u64;
 			let input_quote = AssetConversion::quote_price_tokens_for_exact_tokens(
-				NativeOrAssetId::Asset(asset_id),
-				NativeOrAssetId::Native,
+				NativeOrWithId::WithId(asset_id),
+				NativeOrWithId::Native,
 				fee_in_native,
 				true,
 			);
@@ -355,8 +354,8 @@ fn transaction_payment_without_fee() {
 			assert_eq!(Assets::balance(asset_id, caller), balance - fee_in_asset);
 
 			let refund = AssetConversion::quote_price_exact_tokens_for_tokens(
-				NativeOrAssetId::Native,
-				NativeOrAssetId::Asset(asset_id),
+				NativeOrWithId::Native,
+				NativeOrWithId::WithId(asset_id),
 				fee_in_native,
 				true,
 			)
@@ -412,8 +411,8 @@ fn asset_transaction_payment_with_tip_and_refund() {
 			let len = 10;
 			let fee_in_native = base_weight + weight + len as u64 + tip;
 			let input_quote = AssetConversion::quote_price_tokens_for_exact_tokens(
-				NativeOrAssetId::Asset(asset_id),
-				NativeOrAssetId::Native,
+				NativeOrWithId::WithId(asset_id),
+				NativeOrWithId::Native,
 				fee_in_native,
 				true,
 			);
@@ -428,8 +427,8 @@ fn asset_transaction_payment_with_tip_and_refund() {
 			let final_weight = 50;
 			let expected_fee = fee_in_native - final_weight - tip;
 			let expected_token_refund = AssetConversion::quote_price_exact_tokens_for_tokens(
-				NativeOrAssetId::Native,
-				NativeOrAssetId::Asset(asset_id),
+				NativeOrWithId::Native,
+				NativeOrWithId::WithId(asset_id),
 				fee_in_native - expected_fee - tip,
 				true,
 			)
@@ -493,8 +492,8 @@ fn payment_from_account_with_only_assets() {
 			let fee_in_native = base_weight + weight + len as u64;
 			let ed = Balances::minimum_balance();
 			let fee_in_asset = AssetConversion::quote_price_tokens_for_exact_tokens(
-				NativeOrAssetId::Asset(asset_id),
-				NativeOrAssetId::Native,
+				NativeOrWithId::WithId(asset_id),
+				NativeOrWithId::Native,
 				fee_in_native + ed,
 				true,
 			)
@@ -509,8 +508,8 @@ fn payment_from_account_with_only_assets() {
 			assert_eq!(Assets::balance(asset_id, caller), balance - fee_in_asset);
 
 			let refund = AssetConversion::quote_price_exact_tokens_for_tokens(
-				NativeOrAssetId::Native,
-				NativeOrAssetId::Asset(asset_id),
+				NativeOrWithId::Native,
+				NativeOrWithId::WithId(asset_id),
 				ed,
 				true,
 			)
@@ -585,8 +584,8 @@ fn converted_fee_is_never_zero_if_input_fee_is_not() {
 			// validate even a small fee gets converted to asset.
 			let fee_in_native = base_weight + weight + len as u64;
 			let fee_in_asset = AssetConversion::quote_price_tokens_for_exact_tokens(
-				NativeOrAssetId::Asset(asset_id),
-				NativeOrAssetId::Native,
+				NativeOrWithId::WithId(asset_id),
+				NativeOrWithId::Native,
 				fee_in_native,
 				true,
 			)
-- 
GitLab