From 2440964385673aa14a6bdabe4fd53a9b88b913c8 Mon Sep 17 00:00:00 2001 From: Thomas Eizinger Date: Tue, 2 Mar 2021 16:22:39 +1100 Subject: [PATCH] Allow ASB to be configured with max BTC buy amount This will make it easier to also configure the CLI to display an appropriate max amount the user has to deal with. --- swap/src/asb/command.rs | 13 ++++++------- swap/src/bin/asb.rs | 4 ++-- swap/src/protocol/alice/event_loop.rs | 26 +++++++++++++------------- swap/tests/testutils/mod.rs | 2 +- 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/swap/src/asb/command.rs b/swap/src/asb/command.rs index c29ad9d5..56ab2f64 100644 --- a/swap/src/asb/command.rs +++ b/swap/src/asb/command.rs @@ -1,5 +1,5 @@ -use crate::monero::Amount; -use anyhow::Result; +use crate::bitcoin::Amount; +use bitcoin::{util::amount::ParseAmountError, Denomination}; use std::path::PathBuf; #[derive(structopt::StructOpt, Debug)] @@ -19,13 +19,12 @@ pub struct Arguments { #[structopt(name = "xmr_btc-swap", about = "XMR BTC atomic swap")] pub enum Command { Start { - #[structopt(long = "max-sell-xmr", help = "The maximum amount of XMR the ASB is willing to sell.", default_value="0.5", parse(try_from_str = parse_xmr))] - max_sell: Amount, + #[structopt(long = "max-buy-btc", help = "The maximum amount of BTC the ASB is willing to buy.", default_value="0.005", parse(try_from_str = parse_btc))] + max_buy: Amount, }, History, } -fn parse_xmr(str: &str) -> Result { - let amount = Amount::parse_monero(str)?; - Ok(amount) +fn parse_btc(s: &str) -> Result { + Amount::from_str_in(s, Denomination::Bitcoin) } diff --git a/swap/src/bin/asb.rs b/swap/src/bin/asb.rs index 488aade3..90451fdd 100644 --- a/swap/src/bin/asb.rs +++ b/swap/src/bin/asb.rs @@ -80,7 +80,7 @@ async fn main() -> Result<()> { let wallet_data_dir = config.data.dir.join("wallet"); match opt.cmd { - Command::Start { max_sell } => { + Command::Start { max_buy } => { let seed = Seed::from_file_or_generate(&config.data.dir) .expect("Could not retrieve/initialize seed"); @@ -108,7 +108,7 @@ async fn main() -> Result<()> { Arc::new(monero_wallet), Arc::new(db), rate_service, - max_sell, + max_buy, ) .unwrap(); diff --git a/swap/src/protocol/alice/event_loop.rs b/swap/src/protocol/alice/event_loop.rs index a188930f..9201c594 100644 --- a/swap/src/protocol/alice/event_loop.rs +++ b/swap/src/protocol/alice/event_loop.rs @@ -4,7 +4,7 @@ use crate::{ database::Database, execution_params::ExecutionParams, monero, - monero::{Amount, BalanceTooLow}, + monero::BalanceTooLow, network::{transport, TokioExecutor}, protocol::{ alice, @@ -86,7 +86,7 @@ pub struct EventLoop { monero_wallet: Arc, db: Arc, rate_service: RS, - max_sell: Amount, + max_buy: bitcoin::Amount, recv_encrypted_signature: broadcast::Sender, send_transfer_proof: mpsc::Receiver<(PeerId, TransferProof)>, @@ -110,7 +110,7 @@ where monero_wallet: Arc, db: Arc, rate_service: RS, - max_sell: Amount, + max_buy: bitcoin::Amount, ) -> Result<(Self, mpsc::Receiver>>)> { let identity = seed.derive_libp2p_identity(); let behaviour = Behaviour::default(); @@ -142,7 +142,7 @@ where send_transfer_proof: send_transfer_proof.receiver, send_transfer_proof_sender: send_transfer_proof.sender, swap_handle_sender: swap_handle.sender, - max_sell, + max_buy, }; Ok((event_loop, swap_handle.receiver)) } @@ -215,17 +215,17 @@ where .context("Failed to get latest rate")?; let btc_amount = quote_request.btc_amount; - let xmr_amount = rate.sell_quote(btc_amount)?; - if xmr_amount > self.max_sell { - bail!(MaximumSellAmountExceeded { - actual: xmr_amount, - max_sell: self.max_sell + if btc_amount > self.max_buy { + bail!(MaximumBuyAmountExceeded { + actual: btc_amount, + max: self.max_buy }) } let xmr_balance = monero_wallet.get_balance().await?; let xmr_lock_fees = monero_wallet.static_tx_fee_estimate(); + let xmr_amount = rate.sell_quote(btc_amount)?; if xmr_balance < xmr_amount + xmr_lock_fees { bail!(BalanceTooLow { @@ -299,8 +299,8 @@ where } #[derive(Debug, Clone, Copy, thiserror::Error)] -#[error("The amount {actual} exceeds the configured maximum sell amount of {max_sell} XMR")] -pub struct MaximumSellAmountExceeded { - pub max_sell: Amount, - pub actual: Amount, +#[error("Refusing to buy {actual} because the maximum configured limit is {max}")] +pub struct MaximumBuyAmountExceeded { + pub max: bitcoin::Amount, + pub actual: bitcoin::Amount, } diff --git a/swap/tests/testutils/mod.rs b/swap/tests/testutils/mod.rs index 61cd01db..058cf5d4 100644 --- a/swap/tests/testutils/mod.rs +++ b/swap/tests/testutils/mod.rs @@ -394,7 +394,7 @@ where alice_monero_wallet.clone(), alice_db, fixed_rate::RateService::default(), - alice_starting_balances.xmr, + bitcoin::Amount::ONE_BTC, ) .unwrap();