@@ -30,12 +30,14 @@ pub use types::*;
3030
3131// https://docs.uniswap.org/protocol/V2/concepts/protocol-overview/smart-contracts#minimum-liquidity 
3232// TODO: make it configurable 
33+ // TODO: weights and benchmarking. 
34+ // TODO: more specific error codes. 
35+ // TODO: remove setup. 
3336pub  const  MIN_LIQUIDITY :  u64  = 1 ; 
3437
3538#[ frame_support:: pallet]  
3639pub  mod  pallet { 
3740	use  super :: * ; 
38- 
3941	use  frame_support:: pallet_prelude:: * ; 
4042	use  frame_system:: pallet_prelude:: * ; 
4143
@@ -47,7 +49,7 @@ pub mod pallet {
4749			} , 
4850			Currency ,  ExistenceRequirement ,  ReservableCurrency , 
4951		} , 
50- 		transactional ,   PalletId , 
52+ 		PalletId , 
5153	} ; 
5254	use  sp_runtime:: traits:: { 
5355		AccountIdConversion ,  AtLeast32BitUnsigned ,  CheckedAdd ,  CheckedDiv ,  CheckedMul ,  CheckedSub , 
@@ -93,6 +95,13 @@ pub mod pallet {
9395			+ MutateMetadata < Self :: AccountId > 
9496			+ Transfer < Self :: AccountId > ; 
9597
98+ 		type  PoolAssets :  Inspect < Self :: AccountId ,  AssetId  = Self :: AssetId ,  Balance  = Self :: AssetBalance > 
99+ 			+ Create < Self :: AccountId > 
100+ 			+ InspectEnumerable < Self :: AccountId > 
101+ 			+ Mutate < Self :: AccountId > 
102+ 			+ MutateMetadata < Self :: AccountId > 
103+ 			+ Transfer < Self :: AccountId > ; 
104+ 
96105		/// The dex's pallet id, used for deriving its sovereign account ID. 
97106 		#[ pallet:: constant]  
98107		type  PalletId :  Get < PalletId > ; 
@@ -192,7 +201,6 @@ pub mod pallet {
192201	#[ pallet:: call]  
193202	impl < T :  Config >  Pallet < T >  { 
194203		#[ pallet:: weight( 0 ) ]  
195- 		#[ transactional]  
196204		pub  fn  setup ( origin :  OriginFor < T > ,  amount :  BalanceOf < T > )  -> DispatchResult  { 
197205			let  sender = ensure_signed ( origin) ?; 
198206			let  pallet_account = Self :: account_id ( ) ; 
@@ -216,7 +224,6 @@ pub mod pallet {
216224		} 
217225
218226		#[ pallet:: weight( 0 ) ]  
219- 		#[ transactional]  
220227		pub  fn  create_pool ( 
221228			origin :  OriginFor < T > , 
222229			asset1 :  AssetIdOf < T > ,  // TODO: convert into MultiToken 
@@ -231,8 +238,8 @@ pub mod pallet {
231238			ensure ! ( !Pools :: <T >:: contains_key( & pool_id) ,  Error :: <T >:: PoolExists ) ; 
232239
233240			let  pallet_account = Self :: account_id ( ) ; 
234- 			T :: Assets :: create ( lp_token,  pallet_account. clone ( ) ,  true ,  MIN_LIQUIDITY . into ( ) ) ?; 
235- 			T :: Assets :: set ( lp_token,  & pallet_account,  "LP" . into ( ) ,  "LP" . into ( ) ,  0 ) ?; 
241+ 			T :: PoolAssets :: create ( lp_token,  pallet_account. clone ( ) ,  true ,  MIN_LIQUIDITY . into ( ) ) ?; 
242+ 			T :: PoolAssets :: set ( lp_token,  & pallet_account,  "LP" . into ( ) ,  "LP" . into ( ) ,  0 ) ?; 
236243
237244			let  pool_info = PoolInfo  { 
238245				owner :  sender. clone ( ) , 
@@ -251,7 +258,6 @@ pub mod pallet {
251258		} 
252259
253260		#[ pallet:: weight( 0 ) ]  
254- 		#[ transactional]  
255261		pub  fn  add_liquidity ( 
256262			origin :  OriginFor < T > , 
257263			asset1 :  AssetIdOf < T > , 
@@ -311,7 +317,7 @@ pub mod pallet {
311317				T :: Assets :: transfer ( asset1,  & sender,  & pallet_account,  amount1,  false ) ?; 
312318				T :: Assets :: transfer ( asset2,  & sender,  & pallet_account,  amount2,  false ) ?; 
313319
314- 				let  total_supply = T :: Assets :: total_issuance ( pool. lp_token ) ; 
320+ 				let  total_supply = T :: PoolAssets :: total_issuance ( pool. lp_token ) ; 
315321
316322				let  liquidity:  AssetBalanceOf < T > ; 
317323				if  total_supply. is_zero ( )  { 
@@ -321,7 +327,7 @@ pub mod pallet {
321327						. integer_sqrt ( ) 
322328						. checked_sub ( & MIN_LIQUIDITY . into ( ) ) 
323329						. ok_or ( Error :: < T > :: Overflow ) ?; 
324- 					T :: Assets :: mint_into ( pool. lp_token ,  & pallet_account,  MIN_LIQUIDITY . into ( ) ) ?; 
330+ 					T :: PoolAssets :: mint_into ( pool. lp_token ,  & pallet_account,  MIN_LIQUIDITY . into ( ) ) ?; 
325331				}  else  { 
326332					let  side1 = amount1
327333						. checked_mul ( & total_supply) 
@@ -340,7 +346,7 @@ pub mod pallet {
340346
341347				ensure ! ( liquidity > MIN_LIQUIDITY . into( ) ,  Error :: <T >:: InsufficientLiquidityMinted ) ; 
342348
343- 				T :: Assets :: mint_into ( pool. lp_token ,  & mint_to,  liquidity) ?; 
349+ 				T :: PoolAssets :: mint_into ( pool. lp_token ,  & mint_to,  liquidity) ?; 
344350
345351				pool. balance1  = reserve1 + amount1; 
346352				pool. balance2  = reserve2 + amount2; 
@@ -360,7 +366,6 @@ pub mod pallet {
360366		} 
361367
362368		#[ pallet:: weight( 0 ) ]  
363- 		#[ transactional]  
364369		pub  fn  remove_liquidity ( 
365370			origin :  OriginFor < T > , 
366371			asset1 :  AssetIdOf < T > , 
@@ -385,12 +390,12 @@ pub mod pallet {
385390				let  pool = maybe_pool. as_mut ( ) . ok_or ( Error :: < T > :: PoolNotFound ) ?; 
386391
387392				let  pallet_account = Self :: account_id ( ) ; 
388- 				T :: Assets :: transfer ( pool. lp_token ,  & sender,  & pallet_account,  liquidity,  false ) ?; 
393+ 				T :: PoolAssets :: transfer ( pool. lp_token ,  & sender,  & pallet_account,  liquidity,  false ) ?; 
389394
390395				let  reserve1 = pool. balance1 ; 
391396				let  reserve2 = pool. balance2 ; 
392397
393- 				let  total_supply = T :: Assets :: total_issuance ( pool. lp_token ) ; 
398+ 				let  total_supply = T :: PoolAssets :: total_issuance ( pool. lp_token ) ; 
394399
395400				let  amount1 = liquidity
396401					. checked_mul ( & reserve1) 
@@ -413,7 +418,7 @@ pub mod pallet {
413418					Error :: <T >:: InsufficientAmount 
414419				) ; 
415420
416- 				T :: Assets :: burn_from ( pool. lp_token ,  & pallet_account,  liquidity) ?; 
421+ 				T :: PoolAssets :: burn_from ( pool. lp_token ,  & pallet_account,  liquidity) ?; 
417422
418423				T :: Assets :: transfer ( asset1,  & pallet_account,  & withdraw_to,  amount1,  false ) ?; 
419424				T :: Assets :: transfer ( asset2,  & pallet_account,  & withdraw_to,  amount2,  false ) ?; 
@@ -436,7 +441,6 @@ pub mod pallet {
436441		} 
437442
438443		#[ pallet:: weight( 0 ) ]  
439- 		#[ transactional]  
440444		pub  fn  swap_exact_tokens_for_tokens ( 
441445			origin :  OriginFor < T > , 
442446			asset1 :  AssetIdOf < T > , 
@@ -500,7 +504,6 @@ pub mod pallet {
500504		} 
501505
502506		#[ pallet:: weight( 0 ) ]  
503- 		#[ transactional]  
504507		pub  fn  swap_tokens_for_exact_tokens ( 
505508			origin :  OriginFor < T > , 
506509			asset1 :  AssetIdOf < T > , 
@@ -630,6 +633,7 @@ pub mod pallet {
630633			} 
631634
632635			// TODO: extract 0.3% into config 
636+ 			// TODO: could use Permill type 
633637			let  amount_in_with_fee =
634638				amount_in. checked_mul ( & 997u64 . into ( ) ) . ok_or ( Error :: < T > :: Overflow ) ?; 
635639
0 commit comments