pallet_asset_conversion/
liquidity.rs1use frame_support::{traits::tokens::Balance, transactional};
21use sp_runtime::DispatchError;
22
23use crate::{Config, Pallet};
24
25pub struct AddLiquidityAsset<AssetKind, Balance> {
27 pub asset: AssetKind,
29 pub amount_desired: Balance,
31 pub amount_min: Balance,
33}
34
35pub trait MutateLiquidity<AccountId> {
38 type Balance: Balance;
40 type AssetKind;
42 type PoolId;
44
45 fn create_pool(
51 creator: &AccountId,
52 asset1: Self::AssetKind,
53 asset2: Self::AssetKind,
54 ) -> Result<Self::PoolId, DispatchError>;
55
56 fn add_liquidity(
62 who: &AccountId,
63 asset1: AddLiquidityAsset<Self::AssetKind, Self::Balance>,
64 asset2: AddLiquidityAsset<Self::AssetKind, Self::Balance>,
65 mint_to: &AccountId,
66 ) -> Result<Self::Balance, DispatchError>;
67
68 fn remove_liquidity(
75 who: &AccountId,
76 asset1: Self::AssetKind,
77 asset2: Self::AssetKind,
78 lp_token_burn: Self::Balance,
79 amount1_min_receive: Self::Balance,
80 amount2_min_receive: Self::Balance,
81 withdraw_to: &AccountId,
82 ) -> Result<(Self::Balance, Self::Balance), DispatchError>;
83}
84
85impl<T: Config> MutateLiquidity<T::AccountId> for Pallet<T> {
86 type Balance = T::Balance;
87 type AssetKind = T::AssetKind;
88 type PoolId = T::PoolId;
89
90 #[transactional]
91 fn create_pool(
92 creator: &T::AccountId,
93 asset1: T::AssetKind,
94 asset2: T::AssetKind,
95 ) -> Result<T::PoolId, DispatchError> {
96 Self::do_create_pool(creator, asset1, asset2)
97 }
98
99 #[transactional]
100 fn add_liquidity(
101 who: &T::AccountId,
102 asset1: AddLiquidityAsset<Self::AssetKind, Self::Balance>,
103 asset2: AddLiquidityAsset<Self::AssetKind, Self::Balance>,
104 mint_to: &T::AccountId,
105 ) -> Result<T::Balance, DispatchError> {
106 Self::do_add_liquidity(
107 who,
108 asset1.asset,
109 asset2.asset,
110 asset1.amount_desired,
111 asset2.amount_desired,
112 asset1.amount_min,
113 asset2.amount_min,
114 mint_to,
115 )
116 }
117
118 #[transactional]
119 fn remove_liquidity(
120 who: &T::AccountId,
121 asset1: T::AssetKind,
122 asset2: T::AssetKind,
123 lp_token_burn: T::Balance,
124 amount1_min_receive: T::Balance,
125 amount2_min_receive: T::Balance,
126 withdraw_to: &T::AccountId,
127 ) -> Result<(T::Balance, T::Balance), DispatchError> {
128 Self::do_remove_liquidity(
129 who,
130 asset1,
131 asset2,
132 lp_token_burn,
133 amount1_min_receive,
134 amount2_min_receive,
135 withdraw_to,
136 )
137 }
138}