@@ -92,7 +92,7 @@ impl<T: Config> Pallet<T> {
9292
9393 let mint_fee = Self :: mint_protocol_fee ( reserve_0, reserve_1, asset_0, asset_1, * total_liquidity) ;
9494 if let Some ( fee_to) = Self :: fee_meta ( ) . 1 {
95- if mint_fee > 0 {
95+ if mint_fee > 0 && Self :: fee_meta ( ) . 2 > 0 {
9696 Self :: mutate_liquidity ( asset_0, asset_1, & fee_to, mint_fee, true ) ?;
9797
9898 let old_total_liquidity = * total_liquidity;
@@ -116,12 +116,14 @@ impl<T: Config> Pallet<T> {
116116 T :: MultiAssetsHandler :: transfer ( asset_1, who, & pair_account, amount_1) ?;
117117
118118 if let Some ( _fee_to) = Self :: fee_meta ( ) . 1 {
119- // update reserve_0 and reserve_1
120- let reserve_0 = T :: MultiAssetsHandler :: balance_of ( asset_0, pair_account) ;
121- let reserve_1 = T :: MultiAssetsHandler :: balance_of ( asset_1, pair_account) ;
119+ if Self :: fee_meta ( ) . 2 > 0 {
120+ // update reserve_0 and reserve_1
121+ let reserve_0 = T :: MultiAssetsHandler :: balance_of ( asset_0, pair_account) ;
122+ let reserve_1 = T :: MultiAssetsHandler :: balance_of ( asset_1, pair_account) ;
122123
123- // We allow reserve_0.saturating_mul(reserve_1) to overflow
124- Self :: mutate_k_last ( asset_0, asset_1, reserve_0. saturating_mul ( reserve_1) ) ;
124+ // We allow reserve_0.saturating_mul(reserve_1) to overflow
125+ Self :: mutate_k_last ( asset_0, asset_1, reserve_0. saturating_mul ( reserve_1) ) ;
126+ }
125127 }
126128
127129 Self :: deposit_event ( Event :: LiquidityAdded (
@@ -170,7 +172,7 @@ impl<T: Config> Pallet<T> {
170172
171173 let mint_fee = Self :: mint_protocol_fee ( reserve_0, reserve_1, asset_0, asset_1, * total_liquidity) ;
172174 if let Some ( fee_to) = Self :: fee_meta ( ) . 1 {
173- if mint_fee > 0 {
175+ if mint_fee > 0 && Self :: fee_meta ( ) . 2 > 0 {
174176 Self :: mutate_liquidity ( asset_0, asset_1, & fee_to, mint_fee, true ) ?;
175177
176178 let old_total_liquidity = * total_liquidity;
@@ -190,12 +192,14 @@ impl<T: Config> Pallet<T> {
190192 T :: MultiAssetsHandler :: transfer ( asset_1, & pair_account, recipient, amount_1) ?;
191193
192194 if let Some ( _fee_to) = Self :: fee_meta ( ) . 1 {
193- // update reserve_0 and reserve_1
194- let reserve_0 = T :: MultiAssetsHandler :: balance_of ( asset_0, pair_account) ;
195- let reserve_1 = T :: MultiAssetsHandler :: balance_of ( asset_1, pair_account) ;
195+ if Self :: fee_meta ( ) . 2 > 0 {
196+ // update reserve_0 and reserve_1
197+ let reserve_0 = T :: MultiAssetsHandler :: balance_of ( asset_0, pair_account) ;
198+ let reserve_1 = T :: MultiAssetsHandler :: balance_of ( asset_1, pair_account) ;
196199
197- // We allow reserve_0.saturating_mul(reserve_1) to overflow
198- Self :: mutate_k_last ( asset_0, asset_1, reserve_0. saturating_mul ( reserve_1) ) ;
200+ // We allow reserve_0.saturating_mul(reserve_1) to overflow
201+ Self :: mutate_k_last ( asset_0, asset_1, reserve_0. saturating_mul ( reserve_1) ) ;
202+ }
199203 }
200204
201205 Self :: deposit_event ( Event :: LiquidityRemoved (
@@ -303,7 +307,7 @@ impl<T: Config> Pallet<T> {
303307 }
304308
305309 /// Refer: https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2Pair.sol#L88
306- /// Take as a 1/(fee_point+1) cut of the ExchangeFeeRate fees earned by liquidity providers
310+ /// Take as a [0, 100%] cut of the exchange fees earned by liquidity providers
307311 pub ( crate ) fn mint_protocol_fee (
308312 reserve_0 : AssetBalance ,
309313 reserve_1 : AssetBalance ,
@@ -315,16 +319,18 @@ impl<T: Config> Pallet<T> {
315319 let mut mint_fee: AssetBalance = 0 ;
316320
317321 if let Some ( _fee_to) = Self :: fee_meta ( ) . 1 {
318- if new_k_last != 0 {
322+ if new_k_last != 0 && Self :: fee_meta ( ) . 2 > 0 {
319323 // u128 support integer_sqrt, but U256 not support
320324 // thus we allow reserve_0.saturating_mul(reserve_1) to overflow
321325 let root_k = U256 :: from ( reserve_0. saturating_mul ( reserve_1) . integer_sqrt ( ) ) ;
322326 let root_k_last = U256 :: from ( new_k_last. integer_sqrt ( ) ) ;
323327 if root_k > root_k_last {
324328 let fee_point = Self :: fee_meta ( ) . 2 ;
329+ let fix_fee_point = ( 30 - fee_point) / fee_point;
325330 let numerator = U256 :: from ( total_liquidity) . saturating_mul ( root_k. saturating_sub ( root_k_last) ) ;
326-
327- let denominator = root_k. saturating_mul ( U256 :: from ( fee_point) ) . saturating_add ( root_k_last) ;
331+ let denominator = root_k
332+ . saturating_mul ( U256 :: from ( fix_fee_point) )
333+ . saturating_add ( root_k_last) ;
328334
329335 let liquidity = numerator
330336 . checked_div ( denominator)
@@ -389,6 +395,7 @@ impl<T: Config> Pallet<T> {
389395 } )
390396 }
391397
398+ // 0.3% exchange fee rate
392399 fn get_amount_in (
393400 output_amount : AssetBalance ,
394401 input_reserve : AssetBalance ,
@@ -398,14 +405,12 @@ impl<T: Config> Pallet<T> {
398405 return Zero :: zero ( ) ;
399406 }
400407
401- let ( fee_numerator, fee_denominator) = T :: GetExchangeFee :: get ( ) ;
402-
403408 let numerator = U256 :: from ( input_reserve)
404409 . saturating_mul ( U256 :: from ( output_amount) )
405- . saturating_mul ( U256 :: from ( fee_denominator ) ) ;
410+ . saturating_mul ( U256 :: from ( 1000 ) ) ;
406411
407- let denominator = ( U256 :: from ( output_reserve ) . saturating_sub ( U256 :: from ( output_amount ) ) )
408- . saturating_mul ( U256 :: from ( fee_denominator . saturating_sub ( fee_numerator ) ) ) ;
412+ let denominator =
413+ ( U256 :: from ( output_reserve ) . saturating_sub ( U256 :: from ( output_amount ) ) ) . saturating_mul ( U256 :: from ( 997 ) ) ;
409414
410415 numerator
411416 . checked_div ( denominator)
@@ -414,6 +419,7 @@ impl<T: Config> Pallet<T> {
414419 . unwrap_or_else ( Zero :: zero)
415420 }
416421
422+ // 0.3% exchange fee rate
417423 fn get_amount_out (
418424 input_amount : AssetBalance ,
419425 input_reserve : AssetBalance ,
@@ -423,16 +429,12 @@ impl<T: Config> Pallet<T> {
423429 return Zero :: zero ( ) ;
424430 }
425431
426- let ( fee_numerator, fee_denominator) = T :: GetExchangeFee :: get ( ) ;
427-
428- let input_amount_with_fee = U256 :: from (
429- input_amount. saturating_mul ( fee_denominator. saturating_sub ( fee_numerator) . unique_saturated_into ( ) ) ,
430- ) ;
432+ let input_amount_with_fee = U256 :: from ( input_amount) . saturating_mul ( U256 :: from ( 997 ) ) ;
431433
432434 let numerator = input_amount_with_fee. saturating_mul ( U256 :: from ( output_reserve) ) ;
433435
434436 let denominator = U256 :: from ( input_reserve)
435- . saturating_mul ( U256 :: from ( fee_denominator ) )
437+ . saturating_mul ( U256 :: from ( 1000 ) )
436438 . saturating_add ( input_amount_with_fee) ;
437439
438440 numerator
0 commit comments