From 5381cff5a4c2a7383aca07af30d8406df25c3983 Mon Sep 17 00:00:00 2001 From: ozkanonur Date: Mon, 24 Apr 2023 23:25:10 +0300 Subject: [PATCH] improve `get_receiver_trade_fee` for tendermint Signed-off-by: ozkanonur --- CHANGELOG.md | 1 + mm2src/coins/eth.rs | 2 +- mm2src/coins/eth/eth_tests.rs | 2 +- mm2src/coins/lightning.rs | 2 +- mm2src/coins/lp_coins.rs | 2 +- mm2src/coins/qrc20.rs | 2 +- mm2src/coins/qrc20/qrc20_tests.rs | 2 +- mm2src/coins/solana.rs | 4 +--- mm2src/coins/solana/spl.rs | 4 +--- mm2src/coins/tendermint/tendermint_coin.rs | 11 ++++++++--- mm2src/coins/tendermint/tendermint_token.rs | 9 +++++++-- mm2src/coins/test_coin.rs | 4 +--- mm2src/coins/utxo/bch.rs | 2 +- mm2src/coins/utxo/qtum.rs | 2 +- mm2src/coins/utxo/slp.rs | 2 +- mm2src/coins/utxo/utxo_standard.rs | 2 +- mm2src/coins/z_coin.rs | 2 +- mm2src/mm2_main/src/lp_ordermatch.rs | 12 ++++-------- mm2src/mm2_main/src/lp_swap/maker_swap.rs | 8 +++----- mm2src/mm2_main/src/lp_swap/taker_swap.rs | 8 +++----- 20 files changed, 40 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfbdd4604f..1a99a31fca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ - - Break the loop right after processing any of `SWAP_PREFIX`, `WATCHER_PREFIX`, `TX_HELPER_PREFIX` topic. - An issue was fixed where we don't have to wait for all EVM nodes to sync the latest account nonce [#1757](https://github.com/KomodoPlatform/atomicDEX-API/pull/1757) - optimized dev and release compilation profiles and removed ci [#1759](https://github.com/KomodoPlatform/atomicDEX-API/pull/1759) +- fix receiver trade fee for cosmos swaps [#1767](https://github.com/KomodoPlatform/atomicDEX-API/pull/1767) ## v1.0.2-beta - 2023-04-11 diff --git a/mm2src/coins/eth.rs b/mm2src/coins/eth.rs index f610b91845..4f5e25cf34 100644 --- a/mm2src/coins/eth.rs +++ b/mm2src/coins/eth.rs @@ -4320,7 +4320,7 @@ impl MmCoin for EthCoin { }) } - fn get_receiver_trade_fee(&self, _send_amount: BigDecimal, stage: FeeApproxStage) -> TradePreimageFut { + fn get_receiver_trade_fee(&self, stage: FeeApproxStage) -> TradePreimageFut { let coin = self.clone(); let fut = async move { let gas_price = coin.get_gas_price().compat().await?; diff --git a/mm2src/coins/eth/eth_tests.rs b/mm2src/coins/eth/eth_tests.rs index 2017765c7c..16764f0bf6 100644 --- a/mm2src/coins/eth/eth_tests.rs +++ b/mm2src/coins/eth/eth_tests.rs @@ -957,7 +957,7 @@ fn get_receiver_trade_preimage() { }; let actual = coin - .get_receiver_trade_fee(Default::default(), FeeApproxStage::WithoutApprox) + .get_receiver_trade_fee(FeeApproxStage::WithoutApprox) .wait() .expect("!get_sender_trade_fee"); assert_eq!(actual, expected_fee); diff --git a/mm2src/coins/lightning.rs b/mm2src/coins/lightning.rs index f5ca99c625..0b822dd7a3 100644 --- a/mm2src/coins/lightning.rs +++ b/mm2src/coins/lightning.rs @@ -1301,7 +1301,7 @@ impl MmCoin for LightningCoin { } // Todo: This uses dummy data for now for the sake of swap P.O.C., this should be implemented probably after agreeing on how fees will work for lightning - fn get_receiver_trade_fee(&self, _send_amount: BigDecimal, _stage: FeeApproxStage) -> TradePreimageFut { + fn get_receiver_trade_fee(&self, _stage: FeeApproxStage) -> TradePreimageFut { Box::new(futures01::future::ok(TradeFee { coin: self.ticker().to_owned(), amount: Default::default(), diff --git a/mm2src/coins/lp_coins.rs b/mm2src/coins/lp_coins.rs index 78118f54b7..042238fb59 100644 --- a/mm2src/coins/lp_coins.rs +++ b/mm2src/coins/lp_coins.rs @@ -2190,7 +2190,7 @@ pub trait MmCoin: ) -> TradePreimageResult; /// Get fee to be paid by receiver per whole swap and check if the wallet has sufficient balance to pay the fee. - fn get_receiver_trade_fee(&self, send_amount: BigDecimal, stage: FeeApproxStage) -> TradePreimageFut; + fn get_receiver_trade_fee(&self, stage: FeeApproxStage) -> TradePreimageFut; /// Get transaction fee the Taker has to pay to send a `TakerFee` transaction and check if the wallet has sufficient balance to pay the fee. async fn get_fee_to_send_taker_fee( diff --git a/mm2src/coins/qrc20.rs b/mm2src/coins/qrc20.rs index 54219400cf..5064ae483c 100644 --- a/mm2src/coins/qrc20.rs +++ b/mm2src/coins/qrc20.rs @@ -1375,7 +1375,7 @@ impl MmCoin for Qrc20Coin { }) } - fn get_receiver_trade_fee(&self, _send_amount: BigDecimal, stage: FeeApproxStage) -> TradePreimageFut { + fn get_receiver_trade_fee(&self, stage: FeeApproxStage) -> TradePreimageFut { let selfi = self.clone(); let fut = async move { // pass the dummy params diff --git a/mm2src/coins/qrc20/qrc20_tests.rs b/mm2src/coins/qrc20/qrc20_tests.rs index 2835752f0c..60d8a93527 100644 --- a/mm2src/coins/qrc20/qrc20_tests.rs +++ b/mm2src/coins/qrc20/qrc20_tests.rs @@ -916,7 +916,7 @@ fn test_receiver_trade_preimage() { check_tx_fee(&coin, ActualTxFee::FixedPerKb(EXPECTED_TX_FEE as u64)); let actual = coin - .get_receiver_trade_fee(Default::default(), FeeApproxStage::WithoutApprox) + .get_receiver_trade_fee(FeeApproxStage::WithoutApprox) .wait() .expect("!get_receiver_trade_fee"); // only one contract call should be included into the expected trade fee diff --git a/mm2src/coins/solana.rs b/mm2src/coins/solana.rs index ef3cc38c49..2dbcf091ed 100644 --- a/mm2src/coins/solana.rs +++ b/mm2src/coins/solana.rs @@ -727,9 +727,7 @@ impl MmCoin for SolanaCoin { unimplemented!() } - fn get_receiver_trade_fee(&self, _send_amount: BigDecimal, _stage: FeeApproxStage) -> TradePreimageFut { - unimplemented!() - } + fn get_receiver_trade_fee(&self, _stage: FeeApproxStage) -> TradePreimageFut { unimplemented!() } async fn get_fee_to_send_taker_fee( &self, diff --git a/mm2src/coins/solana/spl.rs b/mm2src/coins/solana/spl.rs index 8aa917aed0..fc97512f77 100644 --- a/mm2src/coins/solana/spl.rs +++ b/mm2src/coins/solana/spl.rs @@ -520,9 +520,7 @@ impl MmCoin for SplToken { unimplemented!() } - fn get_receiver_trade_fee(&self, _send_amount: BigDecimal, _stage: FeeApproxStage) -> TradePreimageFut { - unimplemented!() - } + fn get_receiver_trade_fee(&self, _stage: FeeApproxStage) -> TradePreimageFut { unimplemented!() } async fn get_fee_to_send_taker_fee( &self, diff --git a/mm2src/coins/tendermint/tendermint_coin.rs b/mm2src/coins/tendermint/tendermint_coin.rs index 6e5b4dad32..f53aa94483 100644 --- a/mm2src/coins/tendermint/tendermint_coin.rs +++ b/mm2src/coins/tendermint/tendermint_coin.rs @@ -1988,13 +1988,18 @@ impl MmCoin for TendermintCoin { .await } - fn get_receiver_trade_fee(&self, send_amount: BigDecimal, stage: FeeApproxStage) -> TradePreimageFut { + fn get_receiver_trade_fee(&self, stage: FeeApproxStage) -> TradePreimageFut { let coin = self.clone(); let fut = async move { // We can't simulate Claim Htlc without having information about broadcasted htlc tx. // Since create and claim htlc fees are almost same, we can simply simulate create htlc tx. - coin.get_sender_trade_fee_for_denom(coin.ticker.clone(), coin.denom.clone(), coin.decimals, send_amount) - .await + coin.get_sender_trade_fee_for_denom( + coin.ticker.clone(), + coin.denom.clone(), + coin.decimals, + coin.min_tx_amount(), + ) + .await }; Box::new(fut.boxed().compat()) } diff --git a/mm2src/coins/tendermint/tendermint_token.rs b/mm2src/coins/tendermint/tendermint_token.rs index 54dc2dbc28..9088e4e12c 100644 --- a/mm2src/coins/tendermint/tendermint_token.rs +++ b/mm2src/coins/tendermint/tendermint_token.rs @@ -739,14 +739,19 @@ impl MmCoin for TendermintToken { .await } - fn get_receiver_trade_fee(&self, send_amount: BigDecimal, _stage: FeeApproxStage) -> TradePreimageFut { + fn get_receiver_trade_fee(&self, _stage: FeeApproxStage) -> TradePreimageFut { let token = self.clone(); let fut = async move { // We can't simulate Claim Htlc without having information about broadcasted htlc tx. // Since create and claim htlc fees are almost same, we can simply simulate create htlc tx. token .platform_coin - .get_sender_trade_fee_for_denom(token.ticker.clone(), token.denom.clone(), token.decimals, send_amount) + .get_sender_trade_fee_for_denom( + token.ticker.clone(), + token.denom.clone(), + token.decimals, + token.min_tx_amount(), + ) .await }; Box::new(fut.boxed().compat()) diff --git a/mm2src/coins/test_coin.rs b/mm2src/coins/test_coin.rs index 01e4dda0cc..54bef3a6ba 100644 --- a/mm2src/coins/test_coin.rs +++ b/mm2src/coins/test_coin.rs @@ -318,9 +318,7 @@ impl MmCoin for TestCoin { unimplemented!() } - fn get_receiver_trade_fee(&self, _send_amount: BigDecimal, _stage: FeeApproxStage) -> TradePreimageFut { - unimplemented!() - } + fn get_receiver_trade_fee(&self, _stage: FeeApproxStage) -> TradePreimageFut { unimplemented!() } async fn get_fee_to_send_taker_fee( &self, diff --git a/mm2src/coins/utxo/bch.rs b/mm2src/coins/utxo/bch.rs index 896600d0a3..7ccf3c7bac 100644 --- a/mm2src/coins/utxo/bch.rs +++ b/mm2src/coins/utxo/bch.rs @@ -1234,7 +1234,7 @@ impl MmCoin for BchCoin { utxo_common::get_sender_trade_fee(self, value, stage).await } - fn get_receiver_trade_fee(&self, _send_amount: BigDecimal, _stage: FeeApproxStage) -> TradePreimageFut { + fn get_receiver_trade_fee(&self, _stage: FeeApproxStage) -> TradePreimageFut { utxo_common::get_receiver_trade_fee(self.clone()) } diff --git a/mm2src/coins/utxo/qtum.rs b/mm2src/coins/utxo/qtum.rs index 8fa047cfa1..772bf78575 100644 --- a/mm2src/coins/utxo/qtum.rs +++ b/mm2src/coins/utxo/qtum.rs @@ -924,7 +924,7 @@ impl MmCoin for QtumCoin { utxo_common::get_sender_trade_fee(self, value, stage).await } - fn get_receiver_trade_fee(&self, _send_amount: BigDecimal, _stage: FeeApproxStage) -> TradePreimageFut { + fn get_receiver_trade_fee(&self, _stage: FeeApproxStage) -> TradePreimageFut { utxo_common::get_receiver_trade_fee(self.clone()) } diff --git a/mm2src/coins/utxo/slp.rs b/mm2src/coins/utxo/slp.rs index b5d1731169..1f1053a20b 100644 --- a/mm2src/coins/utxo/slp.rs +++ b/mm2src/coins/utxo/slp.rs @@ -1788,7 +1788,7 @@ impl MmCoin for SlpToken { }) } - fn get_receiver_trade_fee(&self, _send_amount: BigDecimal, _stage: FeeApproxStage) -> TradePreimageFut { + fn get_receiver_trade_fee(&self, _stage: FeeApproxStage) -> TradePreimageFut { let coin = self.clone(); let fut = async move { diff --git a/mm2src/coins/utxo/utxo_standard.rs b/mm2src/coins/utxo/utxo_standard.rs index b21b2fda80..28c5ca0280 100644 --- a/mm2src/coins/utxo/utxo_standard.rs +++ b/mm2src/coins/utxo/utxo_standard.rs @@ -687,7 +687,7 @@ impl MmCoin for UtxoStandardCoin { utxo_common::get_sender_trade_fee(self, value, stage).await } - fn get_receiver_trade_fee(&self, _send_amount: BigDecimal, _stage: FeeApproxStage) -> TradePreimageFut { + fn get_receiver_trade_fee(&self, _stage: FeeApproxStage) -> TradePreimageFut { utxo_common::get_receiver_trade_fee(self.clone()) } diff --git a/mm2src/coins/z_coin.rs b/mm2src/coins/z_coin.rs index 416b6292c1..59fe63d207 100644 --- a/mm2src/coins/z_coin.rs +++ b/mm2src/coins/z_coin.rs @@ -1618,7 +1618,7 @@ impl MmCoin for ZCoin { }) } - fn get_receiver_trade_fee(&self, _send_amount: BigDecimal, _stage: FeeApproxStage) -> TradePreimageFut { + fn get_receiver_trade_fee(&self, _stage: FeeApproxStage) -> TradePreimageFut { utxo_common::get_receiver_trade_fee(self.clone()) } diff --git a/mm2src/mm2_main/src/lp_ordermatch.rs b/mm2src/mm2_main/src/lp_ordermatch.rs index ff55085d61..b43def8222 100644 --- a/mm2src/mm2_main/src/lp_ordermatch.rs +++ b/mm2src/mm2_main/src/lp_ordermatch.rs @@ -4545,13 +4545,9 @@ async fn cancel_orders_on_error(ctx: &MmArc, req: &SetPriceReq, error: E) Err(error) } -pub async fn check_other_coin_balance_for_order_issue( - ctx: &MmArc, - other_coin: &MmCoinEnum, - my_coin_volume: BigDecimal, -) -> CheckBalanceResult<()> { +pub async fn check_other_coin_balance_for_order_issue(ctx: &MmArc, other_coin: &MmCoinEnum) -> CheckBalanceResult<()> { let trade_fee = other_coin - .get_receiver_trade_fee(my_coin_volume, FeeApproxStage::OrderIssue) + .get_receiver_trade_fee(FeeApproxStage::OrderIssue) .compat() .await .mm_err(|e| CheckBalanceError::from_trade_preimage_error(e, other_coin.ticker()))?; @@ -4605,7 +4601,7 @@ pub async fn create_maker_order(ctx: &MmArc, req: SetPriceReq) -> Result Result // Calculate order volume and add to update_msg if new_volume is found in the request let new_volume = if req.max.unwrap_or(false) { let max_volume = try_s!(get_max_maker_vol(ctx, &base_coin).await).volume + reserved_amount.clone(); - try_s!(check_other_coin_balance_for_order_issue(ctx, &rel_coin, max_volume.to_decimal()).await); + try_s!(check_other_coin_balance_for_order_issue(ctx, &rel_coin).await); update_msg.with_new_max_volume(max_volume.clone().into()); max_volume } else if Option::is_some(&req.volume_delta) { diff --git a/mm2src/mm2_main/src/lp_swap/maker_swap.rs b/mm2src/mm2_main/src/lp_swap/maker_swap.rs index 320a65ff97..2bc438c7dc 100644 --- a/mm2src/mm2_main/src/lp_swap/maker_swap.rs +++ b/mm2src/mm2_main/src/lp_swap/maker_swap.rs @@ -475,9 +475,7 @@ impl MakerSwap { )])) }, }; - let taker_payment_spend_trade_fee_fut = self - .taker_coin - .get_receiver_trade_fee(self.maker_amount.clone(), stage.clone()); + let taker_payment_spend_trade_fee_fut = self.taker_coin.get_receiver_trade_fee(stage.clone()); let taker_payment_spend_trade_fee = match taker_payment_spend_trade_fee_fut.compat().await { Ok(fee) => fee, Err(e) => { @@ -2149,7 +2147,7 @@ pub async fn check_balance_for_maker_swap( .await .mm_err(|e| CheckBalanceError::from_trade_preimage_error(e, my_coin.ticker()))?; let taker_payment_spend_trade_fee = other_coin - .get_receiver_trade_fee(volume.to_decimal(), stage) + .get_receiver_trade_fee(stage) .compat() .await .mm_err(|e| CheckBalanceError::from_trade_preimage_error(e, other_coin.ticker()))?; @@ -2203,7 +2201,7 @@ pub async fn maker_swap_trade_preimage( .await .mm_err(|e| TradePreimageRpcError::from_trade_preimage_error(e, base_coin_ticker))?; let rel_coin_fee = rel_coin - .get_receiver_trade_fee(volume.to_decimal(), FeeApproxStage::TradePreimage) + .get_receiver_trade_fee(FeeApproxStage::TradePreimage) .compat() .await .mm_err(|e| TradePreimageRpcError::from_trade_preimage_error(e, rel_coin_ticker))?; diff --git a/mm2src/mm2_main/src/lp_swap/taker_swap.rs b/mm2src/mm2_main/src/lp_swap/taker_swap.rs index 1a41f1128b..96ad3532e2 100644 --- a/mm2src/mm2_main/src/lp_swap/taker_swap.rs +++ b/mm2src/mm2_main/src/lp_swap/taker_swap.rs @@ -971,9 +971,7 @@ impl TakerSwap { )])) }, }; - let maker_payment_spend_trade_fee_fut = self - .maker_coin - .get_receiver_trade_fee(self.taker_amount.to_decimal(), stage.clone()); + let maker_payment_spend_trade_fee_fut = self.maker_coin.get_receiver_trade_fee(stage.clone()); let maker_payment_spend_trade_fee = match maker_payment_spend_trade_fee_fut.compat().await { Ok(fee) => fee, Err(e) => { @@ -2257,7 +2255,7 @@ pub async fn check_balance_for_taker_swap( .await .mm_err(|e| CheckBalanceError::from_trade_preimage_error(e, my_coin.ticker()))?; let maker_payment_spend_trade_fee = other_coin - .get_receiver_trade_fee(volume.to_decimal(), stage) + .get_receiver_trade_fee(stage) .compat() .await .mm_err(|e| CheckBalanceError::from_trade_preimage_error(e, other_coin.ticker()))?; @@ -2352,7 +2350,7 @@ pub async fn taker_swap_trade_preimage( .await .mm_err(|e| TradePreimageRpcError::from_trade_preimage_error(e, my_coin_ticker))?; let other_coin_trade_fee = other_coin - .get_receiver_trade_fee(my_coin_volume.to_decimal(), stage.clone()) + .get_receiver_trade_fee(stage.clone()) .compat() .await .mm_err(|e| TradePreimageRpcError::from_trade_preimage_error(e, other_coin_ticker))?;