mirror of
https://github.com/comit-network/xmr-btc-swap.git
synced 2024-10-01 01:45:40 -04:00
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.
This commit is contained in:
parent
ab4c98678c
commit
2440964385
@ -1,5 +1,5 @@
|
|||||||
use crate::monero::Amount;
|
use crate::bitcoin::Amount;
|
||||||
use anyhow::Result;
|
use bitcoin::{util::amount::ParseAmountError, Denomination};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
#[derive(structopt::StructOpt, Debug)]
|
#[derive(structopt::StructOpt, Debug)]
|
||||||
@ -19,13 +19,12 @@ pub struct Arguments {
|
|||||||
#[structopt(name = "xmr_btc-swap", about = "XMR BTC atomic swap")]
|
#[structopt(name = "xmr_btc-swap", about = "XMR BTC atomic swap")]
|
||||||
pub enum Command {
|
pub enum Command {
|
||||||
Start {
|
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))]
|
#[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_sell: Amount,
|
max_buy: Amount,
|
||||||
},
|
},
|
||||||
History,
|
History,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_xmr(str: &str) -> Result<Amount> {
|
fn parse_btc(s: &str) -> Result<Amount, ParseAmountError> {
|
||||||
let amount = Amount::parse_monero(str)?;
|
Amount::from_str_in(s, Denomination::Bitcoin)
|
||||||
Ok(amount)
|
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,7 @@ async fn main() -> Result<()> {
|
|||||||
let wallet_data_dir = config.data.dir.join("wallet");
|
let wallet_data_dir = config.data.dir.join("wallet");
|
||||||
|
|
||||||
match opt.cmd {
|
match opt.cmd {
|
||||||
Command::Start { max_sell } => {
|
Command::Start { max_buy } => {
|
||||||
let seed = Seed::from_file_or_generate(&config.data.dir)
|
let seed = Seed::from_file_or_generate(&config.data.dir)
|
||||||
.expect("Could not retrieve/initialize seed");
|
.expect("Could not retrieve/initialize seed");
|
||||||
|
|
||||||
@ -108,7 +108,7 @@ async fn main() -> Result<()> {
|
|||||||
Arc::new(monero_wallet),
|
Arc::new(monero_wallet),
|
||||||
Arc::new(db),
|
Arc::new(db),
|
||||||
rate_service,
|
rate_service,
|
||||||
max_sell,
|
max_buy,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ use crate::{
|
|||||||
database::Database,
|
database::Database,
|
||||||
execution_params::ExecutionParams,
|
execution_params::ExecutionParams,
|
||||||
monero,
|
monero,
|
||||||
monero::{Amount, BalanceTooLow},
|
monero::BalanceTooLow,
|
||||||
network::{transport, TokioExecutor},
|
network::{transport, TokioExecutor},
|
||||||
protocol::{
|
protocol::{
|
||||||
alice,
|
alice,
|
||||||
@ -86,7 +86,7 @@ pub struct EventLoop<RS> {
|
|||||||
monero_wallet: Arc<monero::Wallet>,
|
monero_wallet: Arc<monero::Wallet>,
|
||||||
db: Arc<Database>,
|
db: Arc<Database>,
|
||||||
rate_service: RS,
|
rate_service: RS,
|
||||||
max_sell: Amount,
|
max_buy: bitcoin::Amount,
|
||||||
|
|
||||||
recv_encrypted_signature: broadcast::Sender<EncryptedSignature>,
|
recv_encrypted_signature: broadcast::Sender<EncryptedSignature>,
|
||||||
send_transfer_proof: mpsc::Receiver<(PeerId, TransferProof)>,
|
send_transfer_proof: mpsc::Receiver<(PeerId, TransferProof)>,
|
||||||
@ -110,7 +110,7 @@ where
|
|||||||
monero_wallet: Arc<monero::Wallet>,
|
monero_wallet: Arc<monero::Wallet>,
|
||||||
db: Arc<Database>,
|
db: Arc<Database>,
|
||||||
rate_service: RS,
|
rate_service: RS,
|
||||||
max_sell: Amount,
|
max_buy: bitcoin::Amount,
|
||||||
) -> Result<(Self, mpsc::Receiver<RemoteHandle<Result<AliceState>>>)> {
|
) -> Result<(Self, mpsc::Receiver<RemoteHandle<Result<AliceState>>>)> {
|
||||||
let identity = seed.derive_libp2p_identity();
|
let identity = seed.derive_libp2p_identity();
|
||||||
let behaviour = Behaviour::default();
|
let behaviour = Behaviour::default();
|
||||||
@ -142,7 +142,7 @@ where
|
|||||||
send_transfer_proof: send_transfer_proof.receiver,
|
send_transfer_proof: send_transfer_proof.receiver,
|
||||||
send_transfer_proof_sender: send_transfer_proof.sender,
|
send_transfer_proof_sender: send_transfer_proof.sender,
|
||||||
swap_handle_sender: swap_handle.sender,
|
swap_handle_sender: swap_handle.sender,
|
||||||
max_sell,
|
max_buy,
|
||||||
};
|
};
|
||||||
Ok((event_loop, swap_handle.receiver))
|
Ok((event_loop, swap_handle.receiver))
|
||||||
}
|
}
|
||||||
@ -215,17 +215,17 @@ where
|
|||||||
.context("Failed to get latest rate")?;
|
.context("Failed to get latest rate")?;
|
||||||
|
|
||||||
let btc_amount = quote_request.btc_amount;
|
let btc_amount = quote_request.btc_amount;
|
||||||
let xmr_amount = rate.sell_quote(btc_amount)?;
|
|
||||||
|
|
||||||
if xmr_amount > self.max_sell {
|
if btc_amount > self.max_buy {
|
||||||
bail!(MaximumSellAmountExceeded {
|
bail!(MaximumBuyAmountExceeded {
|
||||||
actual: xmr_amount,
|
actual: btc_amount,
|
||||||
max_sell: self.max_sell
|
max: self.max_buy
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
let xmr_balance = monero_wallet.get_balance().await?;
|
let xmr_balance = monero_wallet.get_balance().await?;
|
||||||
let xmr_lock_fees = monero_wallet.static_tx_fee_estimate();
|
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 {
|
if xmr_balance < xmr_amount + xmr_lock_fees {
|
||||||
bail!(BalanceTooLow {
|
bail!(BalanceTooLow {
|
||||||
@ -299,8 +299,8 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, thiserror::Error)]
|
#[derive(Debug, Clone, Copy, thiserror::Error)]
|
||||||
#[error("The amount {actual} exceeds the configured maximum sell amount of {max_sell} XMR")]
|
#[error("Refusing to buy {actual} because the maximum configured limit is {max}")]
|
||||||
pub struct MaximumSellAmountExceeded {
|
pub struct MaximumBuyAmountExceeded {
|
||||||
pub max_sell: Amount,
|
pub max: bitcoin::Amount,
|
||||||
pub actual: Amount,
|
pub actual: bitcoin::Amount,
|
||||||
}
|
}
|
||||||
|
@ -394,7 +394,7 @@ where
|
|||||||
alice_monero_wallet.clone(),
|
alice_monero_wallet.clone(),
|
||||||
alice_db,
|
alice_db,
|
||||||
fixed_rate::RateService::default(),
|
fixed_rate::RateService::default(),
|
||||||
alice_starting_balances.xmr,
|
bitcoin::Amount::ONE_BTC,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user